2010-11-04 134 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在编译时计算,而不是链接时间,所以没有 - 你不能离开它未指定的头还没有拥有它的定义之前评估。