繁体   English   中英

为什么这个c ++程序的输出是3

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM