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); 此时,根据临时变量拷贝构造了te mp,因 此还是没有提示 .
析构
return b的临时传入的实参变量 先析构,打印了第一个 destruct
实际上按语法应该会打 印三个distruct,因为temp析构还会打印一个 .少了一个的原因是编译器做了优化.
如果你把
B temp = Play(5);
改成
Play(5);
你会发现还是打印两个析构,编 译器在处理B temp = Play(5 );的时候,直接把temp 和返回的那个临时 变量合并为一个了.这样可以避免一次构造拷贝,从而提高 效率.