游戏必备运行环境包:关于c++中的构造函数与析构函数的问题

来源:百度文库 编辑:杭州交通信息网 时间:2024/04/30 00:55:25
下面是书上的一段代码:
#include<iostream>
using namespace std;

class MyClass {
int val;
public:
MyClass(int i) {
val = i;
cout<<"Inside constructor\n";
}

~MyClass() { cout<<"Destructing\n"; }

int getval() { return val; }

MyClass mkBigger() {
MyClass o(val * 2);

return o;
}
};

void display(MyClass ob) {
cout<<ob.getval()<<"\n";
}

int main() {
cout<<"Before constructing a.\n";
MyClass a(10);
cout<<"After constructing a.\n\n";

cout<<"Before call to display().\n";
display(a);
cout<<"After display() returns.\n\n";

cout<<"Before call to mkBigger().\n";
a = a.mkBigger();
cout<<"After mkBigger() returns.\n\n";

cout<<"Before second call to display().\n";
display(a);
cout<<"After display() returns.\n\n";

return 0;
}

输出结果:
Before constructing a.
Inside constructor
After constructing a.

Before call to display().
10
After display() returns.

Before call to mkBigger().
Inside constructor
Destructing
After mkBigger() returns.

Before second call to display().
20
After display() returns.

我的问题是:为什么用//框起来的输出结果中只有一个"Destructing"?
按照书上的说法,当函数返回对象o后,销毁o,并且创建一个临时对象保存o的值.所以销毁o'时,输出一次Destructing,然后销毁临时对象是也输出一次Destructing,就是说有两个Destructing,而我的输出结果中只有一个!请高手指点,着到底是怎么回事?是我输入的程序有错误吗?还是书上的有错?
忘了框,应该是:
//Before call to mkBigger().
Inside constructor
Destructing
After mkBigger() returns.//
这段输出结果

return o;
o就是那个临时对象啊,把值return出来后被销毁了,没什么问题啊。