#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;
}
输出为3,为什么不是10。
答案 0 :(得分:6)
因为析构函数在块出口处从概念上运行。
所以ob
是在foo
的中间构建的,但在从foo
答案 1 :(得分:6)
初始化析构函数时,在您的情况下,对象的析构函数在销毁之前就被调用,也就是说,就在foo执行完成之前。因为在调用foo()时我变得等于3,所以得到3.在* 调用析构函数之后,它将仅等于10 <* em>。 如果你这样做,你可能会观察析构函数的行为并理解:
class A
{
public:
~A()
{
i=10;
cout << "In destructor function, i = " << i<< endl;
}
};
答案 2 :(得分:4)
在析构函数中设置值i = 10
。并且在块出口处调用析构函数。
因此,在代码中return i;
foo()
之后,当块退出时,i的值将设置为10.
在cout
语句中,您不打印i
的值,而是打印函数foo()
的返回值,因此它给出3;
cout << "i = " << foo() << endl; // gives result 3
cout << "i = " << i << endl; // gives result 10
答案 3 :(得分:2)
您正在设置
我到10岁 仅在析构函数中。因此,当您打印在对象被销毁之前从函数返回的i的值时,对象 ob 仍然有效。
答案 4 :(得分:2)
一旦你返回i的当前值,它就不再与全局变量相关联,它只是一个在返回时具有i值的副本。然后析构函数可以随意更改,复制的值被冻结
答案 5 :(得分:2)
int foo()
{
i=3;
A ob;
return i;
}
在我们到达return
之前遇到}
语句
在调用析构函数之前已经估计了return
值,该析构函数将变量值设置为10
答案 6 :(得分:-3)
~A()
如果没有~
,我将i=10