如果你在笔试中遇到如下这样的题,相信很多老手都会犹豫吧。
请给出以下程序的输出:
usingnamespacestd; structA { public: A() { cout<<"call ()"<<endl; } ~A() { cout<<"call ~"<<endl; } A(constA&a) { v=a.v; cout<<"call (&)"<<endl; } voidoperator= (constA&a) { v=a.v; cout<<"call =(&)"<<endl; } intv=++s; staticints; }; intA::s=0; AGetA() { Aa; cout<<a.v<<endl; returna; } intmain() { Aa1=GetA(); Aa2(GetA()); Aa3{GetA()}; cout<<"a1 "<<a1.v<<endl; cout<<"a2 "<<a2.v<<endl; cout<<"a3 "<<a3.v<<endl; cout<<A::s<<endl; // ?return0; }
先来说说最后一个输出 A::s 到底等于多少?
好吧,可能看编译器心情吧。
在 XCode 上运行结果是:
call () 1 call () 2 call () 3 a1 1 a2 2 a3 3 3 call ~ call ~ call ~ Program ended with exit code: 0
可以看到,无论是拷备构造还是赋值重载都没有被调用,似乎忽视这个函数的不只有我们,还有编译器……
有兴趣的同学可以试试VC和GNU编译器上是否得出同样的结果。