本文共 1092 字,大约阅读时间需要 3 分钟。
参考下面的这个例子:
#includeusing 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之前,foo就已经获取到了i的当前值3,因此输出为i = 3。如何使得程序可以输出i = 10?
可以使用下面的几种方法:
#includeusing 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;}
#includeusing 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。最后做为返回值进行返回。
int foo(){ i = 3; A *ob = new A(); delete ob; return i;}
int foo(){ i = 3; A ob = A(); return i;}
注意:使用此方法,编译时需要带上--no-elide-constructors选项。
转载地址:http://lqeji.baihongyu.com/