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

Why the output of this c++ program is 3

本文关键字:输出 程序 c++ 为什么      更新时间:2023-10-16
#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 的执行完成之前。由于 i 在调用 foo(( 时等于 3,因此得到 3。它仅在调用析构函数之后 * 等于 10。如果这样做,您可能可以观察析构函数的行为并理解:

class A
{
    public:
    ~A()
    {
        i=10;
         cout << "In destructor function, i = " << i<< endl;
    }
};

在析构函数中设置i = 10的值。析构函数在块出口中被调用。

所以在你的代码中,在 foo()return i;后,当块退出时,i 的值被设置为 10。

cout语句中,你打印的不是i的值,而是函数foo()的返回值,所以它给出3;

cout << "i = " << foo() << endl;  // gives result 3
cout << "i = " << i << endl;      // gives result 10

您正在设置

I 到 10 仅在析构函数中。因此,当您打印在销毁对象之前从函数返回的 i 值时,对象 ob 仍然有效。

一旦你返回 i 的当前值,它就不再隶属于全局变量,它只是一个在返回时具有 i 值的副本。然后析构函数可以更改它喜欢的任何内容,复制的值被冻结

int foo()
{
    i=3;
    A ob;
    return i;
}

在我们到达}之前遇到了return语句在调用将变量值设置为 10 的析构函数之前,已经估计了return

~A()

如果没有~我就i=10