133.分析一下这段程序的输出 (Autodesk)
class B
{
public:
B()
{
cout<<"default constructor"<<endl;
}
~B()
{
cout<<"destructed"<<endl;
}
B(int i):data(i)
{
cout<<"constructed by parameter" << data <<endl;
}
private:
int data;
};
B Play( B b)
{
return b ;
}
int main(int argc, char* argv[])
{
B temp = Play(5);
return 0;
}
首先调用带参数构造,构造传入参数,命令行输出constructed by parameter5
return b; 实际上用传过来的实参又构造了一个临时的匿名变量,但调用的是拷贝构造,但没有重载拷贝构造,所以没有打印提示信息.
B temp = Play(5); 此时,根据临时变量拷贝构造了temp,因此还是没有提示.
析构
return b的临时传入的实参变量先析构,打印了第一个destruct
实际上按语法应该会打印三个distruct,因为temp析构还会打印一个.少了一个的原因是编译器做了优化.
如果你把
B temp = Play(5);
改成
Play(5);
你会发现还是打印两个析构,编译器在处理B temp = Play(5);的时候,直接把temp和返回的那个临时变量合并为一个了.这样可以避免一次构造拷贝,从而提高效率.