声明与定义的C ++存储类和限定符规则

时间:2013-07-20 17:14:51

标签: c++ c++11 header initialization declaration

不可否认,这样做的原因已经消退,因为C ++ 11已经摆脱了那个令人讨厌的规则 - 我认为它是声明静态const int / char / enum允许你在标题中初始化,但对于所有其他类型你不能。因此我想尝试总结C ++的声明和定义约定。

是否有人能够接受我在下面尝试/做的事情并将其延伸到我错过/得到的任何错误。我想总结各种static / const / int / non-int变量的声明和定义的所有“规则”。理想情况下,这可以放入一些包含3列的表中:数据类型/声明/定义 - 但我不知道如何在这里做到这一点:

静态数据成员(声明)

  • 仅提供类型和名称,请勿初始化,因为使用相同标头的多个文件最终会产生多个副本。

静态数据成员(定义)

  • 初始化源文件中的变量。不必在源文件定义中重复“static”一词。

const数据成员(声明)

  • 使用关键字const声明但未在头文件中初始化。

const数据成员(定义)

  • 必须使用构造函数中的初始化列表进行初始化。

static和const 数据成员(声明)

  • 使用关键字static和const但未初始化在头文件中声明。

static和const 数据成员(定义)

  • 在源文件中定义。不需要使用关键字static和const(??)。

注意:我理解pre-C ++ 11 int / enum / char曾经有一个关于静态的特殊规则(或者它是静态const?),是否可以在其中初始化头??

  • 全局变量规则
  • 可变的规则
  • 外部规则
  • volatile是否遵循与“const”完全相同的规则?静态volatile将遵循静态数据成员等的约定吗?

1 个答案:

答案 0 :(得分:0)

在C ++标准中,constvolatile几乎总是“彼此相邻”。特别是,volatileconst具有相同的优先顺序和“需要位置”。

Pre C ++ 11(当然还有C ++ 11)你可以初始化const static个简单类型(例如int或密切相关的类型,但不能初始化其他类型(那些有构造函数的例子)。