奇怪的输出,好手解释一下
奇怪的输出,高手解释一下~class B{public:B(){coutdefaultendl}~B(){coutdestructedendl}B(
奇怪的输出,高手解释一下~ class B { public: B() { cout<<"default"<<endl; } ~B() { cout<<"destructed"<<endl; } B(int i) { cout<<"constructed by parameter"<<endl; } }; B play(B b) { return b; } int main(int argc, char* argv[]) { B t=play(5); return 0; } 为什么输出两个"descontructor"?我觉得应该有3个descontructor才对,play返回时临时变量销毁,t销毁, 还有play形参的销毁 C++ [解决办法] play形参和play返回时临时变量是同一个。[解决办法] 试试这个,并且自行学习一下RVO(return value optimization)
class B { public: B() { cout<<"default"<<endl; } B(int i) { cout<<"constructed by parameter"<<endl; } B(B const& b) { cout<<"copy construtor"<<endl; } B& operator=(B const& b) { cout<<"copy asignment"<< endl; return *this; } ~B() { cout<<"destructed"<<endl; } }; B play(B b) { return b; } int main(int argc, char* argv[]) { B t=play(5); return 0; }[解决办法] 引用: 引用:play形参和play返回时临时变量是同一个。 是同一个?不是吧! B t=play(5);改为两句 B t; t=play(5); 这样就有3个constructor输出了,怎么解释这个? B play(B b)
{
return b;
}
这儿的b不是同一个变量吗???
[解决办法] 引用: 引用:play形参和play返回时临时变量是同一个。 是同一个?不是吧! B t=play(5);改为两句 B t; t=play(5); 这样就有3个constructor输出了,怎么解释这个? B t = play(5);和B t; t = play(5);不一样哦。查查拷贝构造函数。
[解决办法] 对学习编程者的忠告:
眼过千遍不如手过一遍!
书看千行不如手敲一行!
手敲千行不如单步一行!
单步源代码千行不如单步对应汇编一行!
单步类的实例“构造”或“复制”或“作为函数参数”或“作为函数返回值返回”或“参加各种运算”或“退出作用域”的语句对应的汇编代码几步后,就会来到该类的“构造函数”或“复制构造函数”或“运算符重载”或“析构函数”对应的C/C++源代码处。
VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
[解决办法] 引用: 引用:引用:play形参和play返回时临时变量是同一个。 是同一个?不是吧! B t=play(5);改为两句 B t; t=play(5); 这样就有3个constructor输出了,怎么解释这个? B play(B b) { return b; } 这…… 好像还真不一样。
经过测试证明:play(5);会调用一次有参数构造函数,还会调用一次拷贝构造函数。不知为何。然而B t=play(5);t却没有初始化,既不掉用构造函数也不会调用拷贝构造函数。这个无语了有点。所以B t=play(5);程序结束并没有析构t,而B t;会调用无参构造函数初始化,程序结束会析构t,所以比第一种多一次析构。
------解决方案--------------------
引用: 引用:引用:引用:play形参和play返回时临时变量是同一个。 是同一个?不是吧! B t=play(5);改为两句 B t; t=play(5); 这样就有3个constructor输出了,怎么解释这个? B play(…… B t=play(5);
和
play(5);
的效果是一样的,play(5);是构造一个对象,将返回值对象通过
B(B const& b)
{
cout<<"copy construtor"<<endl;
}
函数赋给了一个看不到的临时变量,所以有两个对象产生,一个看得见,一个看不见。
B t=play(5);
将返回值对象给了赋给了t,两个对象都是看得见的。并不是先产生临时变量再赋给t。
[解决办法] 如果是
B t;
t=play(5);
就调用三次构造函数。其中的细节你看看堆栈。就明白了。
[解决办法] 这次我感觉6楼说得对
[解决办法] 你可以试下单步调式,这是最基本的,,跑跑就明白了