[英]Why the output of this c++ program is 3
#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。
因为析构函数在概念上是在块出口处运行的。
因此ob
构造在foo
的中间,但是当从foo
返回时被破坏
在初始化析构函数时,在您的情况下,对象的析构函数在它被销毁之前被调用,也就是说,就在foo执行完成之前。 因为在调用foo()时我变为等于3,所以得到3.在调用析构函数之后 ,它将仅等于10 *。 如果你这样做,你可能会观察析构函数的行为并理解:
class A
{
public:
~A()
{
i=10;
cout << "In destructor function, i = " << i<< endl;
}
};
您在析构函数中设置值i = 10
。 并且在块出口处调用析构函数。
所以在你的代码中,在return i;
之后return i;
在foo()
,当块退出时,i的值被设置为10。
在cout
语句中,你不是打印i
的值,而是函数foo()
的返回值,所以它给出3;
cout << "i = " << foo() << endl; // gives result 3
cout << "i = " << i << endl; // gives result 10
你在设置
我只在析构函数中使用10 。 因此,在打印对象被销毁之前从函数返回的i值时,对象ob仍然有效。
一旦你返回i的当前值,它就不再与全局变量相关联,它只是一个在返回时具有i值的副本。 然后析构函数可以随意更改,复制的值被冻结
int foo()
{
i=3;
A ob;
return i;
}
在return
之前,我们到达声明中遇到}
的return
值调用它设置变量值的析构函数之前就已经预计10
~A()
如果没有~
我将是i=10
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.