2013-12-11 104 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