2010-08-26 57 views
3

我知道如何初始化一个不是整数的静态成员,但我想知道,这个语法的基本原理是什么?我想能够只是把值类,比如你可以用一个整数成员,一拉:静态const(非整型)成员初始化语法的基本原理?

class A { 
    static const int i = 3; 
}; 

我意识到这可能意味着更多的重建,如果我改变的价值,因为它是一个变化在头文件中 - 但在某些情况下,这种情况不太可能发生 - 和修改头文件中的#define一样糟糕。

它似乎并不像编译器所能理解的那样困难。是否有技术上的原因,为什么它的工作方式?还是只是编译器执行将实现与定义分开的良好实践的情况?

回答

6

因为这是类别的声明。你还没有任何物体。

您需要实际上定义值某处---某处特定。

由于它是static它实际上占据了某处的空间。但是,由于具有该声明的.H文件可以包含在许多源文件中,哪一个文件定义了哪个文件保存了它正在使用的实际空间?让编译器自动定义每个对象文件中的空间并让链接器将其排除将违反“One Definition Rule”。

1

静态类成员具有链接,因此它需要位于源文件中。仅仅因为你声明它并不意味着它真的不能改变(例如,请查看volatile)。

这可以帮助你:

class A { 
    enum { i = 3 }; // use an enum to set a constant value in the class declaration 
    void f() { int k = int(i); } 
} 
+1

你可以* *初始化类为OP节目内的静态常量*整数类型*。我认为这个问题是关于其他类型的。 – UncleBens 2010-08-26 15:43:47