首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

奇怪的输出,好手解释一下

2013-04-20 
奇怪的输出,高手解释一下~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楼说得对
[解决办法]
你可以试下单步调式,这是最基本的,,跑跑就明白了

热点排行
Bad Request.