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

Posted

技术标签:

【中文标题】静态常量(非整数)成员初始化语法背后的基本原理?【英文标题】:Rationale behind static const (non-integral) member initialization syntax? 【发布时间】:2010-08-26 13:35:17 【问题描述】:

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

class A 
  static const int i = 3;
;

我意识到,如果我更改值,这可能意味着更多的重建,因为它是标题中的更改 - 但在某些情况下,这不太可能 - 无论如何都与更改标题中的 #define 一样糟糕。

对于编译器来说,这似乎不是一件很难理解的事情。它的工作方式是否有技术原因?还是只是编译器强制执行将实现与定义分离的良好做法?

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

【参考方案2】:

静态类成员有链接,所以它需要在源文件中。仅仅因为你声明它 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); 

【讨论】:

可以在类中初始化一个静态 const 整数类型,如 OP 所示。我认为问题是关于其他类型的。

以上是关于静态常量(非整数)成员初始化语法背后的基本原理?的主要内容,如果未能解决你的问题,请参考以下文章

静态常量非整形成员变量的初始化问题

静态常量整数成员在class内部直接初始化

Visual Studio 2013 CTP 是不是支持非整数类型的类内静态常量初始化程序?

为啥类的常量数据成员需要在构造函数中初始化?

静态常量整数数组

静态(数据)成员与类