2011-05-01 42 views

回答

4

是的,當然你可以初始化全局變量。對於內置類型,您可以使用任何可用於賦值的值(也可以初始化不能分配的數組)。對於一個類的類型,由你決定什麼類型/值將被允許(和/或要求),當你設計類。對於預定義的類,您基本上必須查閱文檔以找出它允許/需要的內容。

然而,最終,它是一個全局的事實並不影響可以提供的值。作爲一個全局可以影響你如何獲得價值 - 特別是,當初始化完成後,你顯然不能使用那些尚未提供的值。這可能會比最初看起來更微妙一點,因爲保證全局變量相對於其他變量的初始化順序很少,所以(例如)當全局變量的構造函數執行時,std::cinstd::coutstd::cerr可能尚未構建,所以如果您想根據用戶的輸入初始化某些內容,則可能需要採取特殊步驟,以確保初始化的順序或其他(例如)針對該特定方式使用C風格的I/O工作。

3

當然可以。爲什麼我們不能?

//global variables 
int g_int = 100; 
int g_float = 10.0; 
int g_char = 'A'; 

class X 
{ 
    int value; 
    public: 
     X(int v) : value(v){} 
}; 

X g_x1(10); //initialize with argument 10 
X g_x2 = X(198); //with arg 198 

int main() 
{ 
} 
5

允許值取決於變量的類型。對於int,0或42都可以。對於string,「hello world」有效。初始化全局變量與初始化其他變量相同,因此您可以使用很多自由度。

通常最好保持簡單;如果你需要一個複雜的全局初始化器,那麼這個變量可能會出錯,但如果需要的話,你可以做很多事情。

這樣做的,在其最基本的語法是:

int global_Int = 42; 
string global_String = "Hello World"; 

但是,如果這是在插頭來實現(因爲全局在共同的頭部一般聲明),你會得到重複的聲明和錯誤。爲了解決這個問題,使用extern關鍵字來聲明它們,然後初始化代碼文件:

標題:

extern int global_Int; 
extern string global_String; 

代碼:

#include "header.hpp" 

int global_Int = 42; 
string global_String = "Hello World"; 

然後就包括你的頭每當你需要使用變量。您還可以根據需要添加其他關鍵字(例如,如果您需要const全局變量)。

1

可能是相當多的東西,如構造函數的調用:

static const std::string boo("42"); 

不過要小心 - 這些main()前運行,但它們的順序是不確定的(見"static initialization order fiasco")。