为什么静态成员初始化需要“再次输入”?

时间:2013-12-01 11:53:22

标签: c++ class static initialization

情况就是这样。在使用此类之前,必须初始化静态类memmbers,因为静态成员不是对象可靠的。它们占据了堆中自己的存储位置。 但我对初始化必须遵守的规则感到困惑。

以下代码解释了我的担忧。

class TEST
{
public:
    ...
    static int val;
    ...
}
//Initialization
//int TEST::val = 1;//This is correct.
TEST::val = 1; //This is wrong, compiler msg: lack of type identifier.
//I think that the val member has been declared as int type.
//So WHY must I redeclare its type again? Or I did just miss something?

2 个答案:

答案 0 :(得分:2)

static int val是一个声明(只是一个类型和名称,没有内存,没有值)。定义'分配'存储(可能是没有默认构造函数的垃圾),初始化还会分配一个值。它与函数原型和实际定义相同。

答案 1 :(得分:2)

理论上,没有什么能阻止C ++设计者让你跳过val成员定义中的类型。实际上,编译器已经知道了类型,并且看起来像赋值的语法在函数外部无效,因此没有什么可以阻止编译器实现这种方法。

但是,这会使解析器更复杂,因为必须根据上下文对同一构造(赋值)进行不同的解释。换句话说,同一行

TEST::val = 1;

意味着函数内外完全不同的东西。在函数内部使用时,该行将被视为赋值;当在函数外部使用时,同一行将被视为定义。

为了让生活变得更简单,无论是对于他们自己还是语言的用户,设计师都决定使用熟悉的定义语法,只需花费很少的费用就可以让用户重复自己。

相关问题