静态const(非整数)成员初始化语法背后的基本原理?

时间:2010-08-26 13:35:18

标签: c++ syntax

我知道如何初始化一个不是整数的静态成员,但我想知道,这个语法背后的基本原理是什么?我希望能够将值放在类中,就像你可以使用整数成员一样,la:

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

我意识到这可能意味着如果我更改值会更多重建,因为它是标题中的更改 - 但在某些情况下这是非常不可能的 - 并且就像在标题中更改#define一样糟糕。

对于编译器而言,这似乎并不是一件非常难以理解的事情。是否有技术原因,它的工作方式如何?或者仅仅是编译器强制执行将实现与定义分开的良好实践的情况?

2 个答案:

答案 0 :(得分:6)

因为那是类声明。你还没有任何对象。

你需要在某个地方定义值 - 某处特定的地方。

因为它static实际占用空间。但是,由于具有该声明的.H文件可以在许多源文件中包含#included,哪一个定义了它所使用的实际空间?让编译器自动定义每个目标文件中的空间并让链接器对其进行排序将违反“One Definition Rule”。

答案 1 :(得分:1)

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

这可能会对您有所帮助:

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