2

我正在阅读 C++ 常见问题解答。在第 16 章,使用静态它说:

“一个 const 静态数据成员在类中声明,通常在源文件中定义(和初始化),例如 .cpp 文件。但在某些情况下,它可以在适当的类主体中初始化。”

然后继续提到可以声明整数和非整数类型的位置(尽管我认为这在 C++11 中改变了积分)。

我的问题是,上述内容是否仅适用于 const 静态数据成员而不适用于非 const 静态数据成员?

我开始变得非常困惑,不明白为什么会有这些限制?volatile、mutable 和其他关键字变量是否有这些规则?有人怎么能轻松学习这个(除了 24/7 全天候编程)?

4

2 回答 2

3

C++ 2011 在声明变量方面没有任何改变!但是,您可以在类定义的主体中初始化所有成员变量。构造对象时,类定义中声明的值是默认使用的值。但是,如果成员初始值设定项列表提及成员,则初始值设定项列表优先。

静态数据成员一般需要定义。但是,static成员const可能会在类主体中进行声明和初始化:如果成员未绑定到引用或获取其地址,则声明就足够了,您不需要提供定义。但是,如果您使用地址,它仍然需要定义。

以下是如何设置成员初始化默认值的几个示例:

class foo
{
private:
    int i{5};
    int j = 6;
    std::vector<int> v{ 1, 2, 3, 4 };
    std::vector<int> w = std::vector<int>(2, 10);
    std::vector<int> z = decltype(z)(2, 10);

    // ...
};

请注意,使用括号不起作用。因此,可能需要使用上述最后两种形式之一。

于 2013-01-03T22:11:05.270 回答
1

一般的推理是,如果它需要存储,它必须在源文件中定义。如果它是静态 const 整数,则不需要存储 - 编译器可以在您使用该变量的任何地方替换一个文字整数。如果它是非静态的,则它是一个需要存储在每个对象中的成员变量。如果它是非常量的,你需要一个地方来保存更新时的值。

于 2013-01-03T22:07:47.207 回答