代码之家  ›  专栏  ›  技术社区  ›  Clifford

“静态const”与“const”的C++语义

c++
  •  127
  • Clifford  · 技术社区  · 15 年前

    在C++中,具体的语义差异是什么?

    static const int x = 0 ;
    

    const int x = 0 ;
    

    两者皆适用 static

    2 回复  |  直到 15 年前
        1
  •  134
  •   Lightness Races in Orbit    5 年前

    在文件范围内,C++没有差异。 const

    在函数中,可以根据参数计算第二个版本。在C或C++中,它不一定是编译时常数,就像其他语言所要求的一样。

    在一个类中,基本上和函数是一样的。实例 值可以在 ctor初始值设定项列表 static const 在启动初始化期间设置,在程序的其余部分保持不变。(注:代码为 static 成员看起来有些不同,因为声明和初始化是分开的。)

    记住,在C++中, 方法 只读 常数 然后程序的其他部分可能会在您不查看时更改值。如果变量是用 ,则初始化之后没有人可以更改它,但初始化仍然可以是任意复杂的。

        2
  •  7
  •   Ciro Santilli OurBigBook.com    6 年前

    const 暗示 static

    这是对以下内容的引用: https://stackoverflow.com/a/3709257/895245

    C++17 n4659 standard draft 6.5“程序和链接”:

    三 具有命名空间作用域(6.3.6)的名称如果是

    • (3.1)明确声明为静态的变量、函数或函数模板;或,
    • 先前宣布有外部联系;或

    第6条:“基本概念”给出了将C改为C的理由:

    6.5[另见10.1.7]

    更改:显式声明为const而未显式声明为extern的文件作用域的名称已更改 内部链接,而在C中它将有外部链接。

    理由:因为在C++中翻译时可以使用const对象作为值,所以这个特性促使 程序员为每个const对象提供一个显式的初始值设定项。此功能允许用户将 源文件中包含在多个翻译单元中的常量对象。

    对原始特征的影响:对定义良好的特征语义的改变。

    转换的困难:语义转换。

    使用范围:很少。

    另请参见: Why does const imply internal linkage in C++, when it doesn't in C?

    What does 'const static' mean in C and C++?

    • 预C++ 17: extern 在头文件中,定义在cpp文件中