2010-11-04 184 views
0

是否可以初始化靜態常量空數組,請參見下面的代碼,初始化靜態常量空數組

//CFoo.h 
class CFoo 
{ 
public: 
    CFoo(); 
    ~CFoo(); 

public: 
    static const int arr[]; 

}; 

//CFoo.cpp 
const int arr[] = {0,1,2}; 

CFoo::CFoo(){} 
CFoo::~CFoo(){} 

編輯:

看來碼是有效的,而對於後續問題,爲什麼我不能sizeof靜態const數組,如:

sizeof(CFoo::arr); 

有沒有什麼辦法可以sizeof CFoo :: arr?

謝謝。

回答

5

是;您需要限定陣列的名稱:

const int CFoo::arr[] = {0,1,2}; 

類型的CFoo::arr是不完整的,直到定義,讓你在你如何使用它是有限的。例如,您不能將其用作sizeof的參數。如果完成申報,那麼就沒有問題:

struct CFoo { 
    static const int arr[3]; 
}; 

但是請注意,這是因爲在兩個不同的地方被指定的大小這個具有可維護性的問題,你可能發生,如果有少不會得到一個錯誤初始化器的值比數組的聲明大小。

+0

謝謝,但是有可能使用sizeof(CFoo :: arr)?有什麼方法可以sizeof CFoo :: ARR或找到它的大小? – domlao 2010-11-04 06:24:16

+0

令人討厭,但對於經常更改此類值的長列表的特定位置,您可以定義VALUES {0,1,2} \ const int CFoo :: arr [] = VALUES; static const int check_cfoo_arr_size [] = VALUES;'和static斷言:sizeof CFoo :: arr == sizeof check_cfoo_arr_size' ... :-(。 – 2010-11-04 06:41:59

3

是的。

const int CFoo:arr[] = {0,1,2}; 
3

的sizeof在編譯時計算,而不是鏈接時間,所以沒有 - 你不能離開它未指定的頭還沒有擁有它的定義之前評估。