参考下面的这个例子:
#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之前,foo就已经获取到了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选项。