2013-12-11 70 views
2
#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.为什么这个C++程序的输出是3

+0

您只在析构函数中将i设置为10。因此,当您打印i的值时,对象ob仍然有效。 – ckv

回答

6

由于析构函数被概念性地在块退出运行。

所以ob构造中的foo中间但从foo

+0

+1精彩回答:) –

2

返回你只在析构函数设置

我到10 时被破坏。因此,对象ob在打印对象被销毁前从函数返回的i的值时仍然有效。

-3

~A()

如果没有~我会i=10

+0

你的意思是d构造? –

2

一旦你回到我的当前值,它不再附属于全局变量,它只是在有i的值复制返回。析构函数然后可以改变它喜欢的任何东西,复制的值被冻结

4

您在析构函数中设置值i = 10。并且析构函数在块出口处被调用。

在你的代码

所以,return i;foo(),当块退出时,我的价值是越来越设置为10

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

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

当初始化析构函数,你的情况,该对象的析构函数被调用之前被销毁,也就是Foo的执行完成之前。因为在调用foo()时我等于3,所以你得到3.它将等于10 * *之后析构函数被调用。 如果你这样做,你也许可以看到析构函数的行为和理解:

class A 
{ 
    public: 
    ~A() 
    { 
     i=10; 
     cout << "In destructor function, i = " << i<< endl; 
    } 
}; 
2
int foo() 
{ 
    i=3; 
    A ob; 
    return i; 
} 

遇到return声明我们到达之前,}return值调用一个设置变量的析构函数之前就已经估计值为10