2012-10-13 114 views
3

可能重複:
file scope and static floats
What are static variables?靜態對象初始化C++

這裏是從一本書的碼。

class X 
{ 
    int i; 
public: 
    X(int ii = 0) : i(ii) {cout<<i<<endl;} // Default 
    ~X() { cout << "X::~X()" << endl; } 
}; 
void f() 
{ 
    static X x1(47); 
    static X x2; // Default constructor required 
} 

int main() 
{ 
    f(); 

    return 0; 
} 

我的問題是爲什麼我會喜歡在函數f()中聲明一個靜態對象?如果我沒有將x1和x2聲明爲靜態會發生什麼?

回答

1

對於這個代碼它對程序的觀察行爲沒有區別。

變化mainf而不是僅一次兩次,並觀察差異 - 如果變量static則有史以來唯一一對X對象(首次f的叫法),而如果他們而不是static,那麼每次調用都會創建一對對象。

或者,改變main調用f後打印的東西。然後觀察與static,該X對象後main打印(靜態對象的生活,直到節目結束)破壞,而無需static的對象之前main打印摧毀(自動對象只能活直至退出其範圍,在這種情況下是功能f)。

1

第一次函數f()被擊中靜力學將被初始化(延遲加載)。如果它們沒有被聲明爲靜態的,那麼它們將是局部變量,並且每次調用函數f()時都會重新創建它們。

所有調用F()會導致使用相同的X1和X2。

+0

感謝您的解釋。看起來,即使我在全局空間中有一個新函數並調用f(),當使用靜態並且不使用靜態f()時,它也不起作用。 – macroland

0

int f() 
{ 
     int i = 0; 
     ++i; 
     return i; 
} 

int f2() 
{ 
    static int i = 0; 
    ++i; 
    return i;  
} 

int main() 
{ 
     for (int i = 0; i < 10; ++i) { cout << f1() << ' ' << f2() << endl; } 
} 

之間的區別是,F1總是會做出新的局部變量i並將其設置爲零,然後增加它,而F2將創建一個static局部變量i和其初始化爲零一次,然後每次調用它從先前的調用值增加它。

0

下面是一些代碼來測試什麼函數內的靜態對象的意思是:

#include <iostream> 

using namespace std; 
class A { 
    public: 
    void increase() { 
    static int b = 0; 
    b++; 
    cout << "A::increase: " << b << endl; 
    } 
}; 
int main() { 
     A a; 
     a.increase(); 
     a.increase(); 
     a.increase(); 
     return 0; 
} 

,輸出是:

A::increase: 1 
A::increase: 2 
A::increase: 3 

注意b的值保持函數調用之間? Here就是ideone的例子,所以你可以玩它。