C++构造与析构(11) - 析构函数的行为

来源:互联网 发布:莫达非尼淘宝 编辑:程序博客网 时间:2024/06/03 20:45
参考下面的这个例子。
#include <iostream>using namespace std;int i; class A{public:    ~A()    {        i=10;    }}; int foo(){    i=3;    A ob;    return i;} int main(){    cout << "i = " << foo() << endl;    return 0;}<
上述程序的输出结果:
 i = 3
为何结果是3,而不是10?
当从一个函数返回时,析构函数属于一个最后才被执行的方法。 当i值已经拷贝给函数的返回值(return value)之后,ob的析构函数才会被调用。因此,在析构函数将i值修改为10之前,就已经获取到了i的当前值3,因此输出为i = 3.

如何使得程序可以输出“i = 10"?
可以使用下面的几种方法:
1) 返回引用
#include <iostream>using namespace std; int i; class A{public:    ~A()    {        i = 10;    }}; int& foo(){    i = 3;    A ob;    return i;} int main(){    cout << "i = " << foo() << endl;    return 0;}

2. 在块作用域内创建对象
#include <iostream>using namespace std; int i; class A{public:    ~A()    {        i = 10;    }}; int foo(){    i = 3;    {        A ob;    }    return i;} int main(){    cout << "i = " << foo() << endl;    return 0;}
因为对象ob是在块中创建的,则块作用域结束时,会调用对象ob的析构函数,此时i值会被修改为10.最后做为返回值进行返回。

3. 创建动态对象,然后删除之
int foo(){    i = 3;    A *ob = new A();    delete ob;    return i;}

4. 创建临时对象
int foo(){    i = 3;    A ob = A();    return i;}
注意:使用此方法,编译时需要带上--no-elide-constructors选项。
0 0
原创粉丝点击