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

时间:2013-12-11 06:05:21

标签: c++

#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。

7 个答案:

答案 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