我正在阅读C++常见问题。在第16章中,使用静态它说:
const静态数据成员在类中声明,通常在源文件(如.cpp文件)中定义(并初始化)。但在某些情况下,它可以在类体本身中初始化。
然后继续提到可以声明积分和非整数类型的地方(尽管我认为C++11中的积分改变了这种情况)。
我的问题是,上述内容是否仅适用于const静态数据成员,而不适用于非const静态数据成员?
我开始感到很困惑,不明白为什么会有这些限制?这些规则是否适用于易失性、可变和其他关键字变量?一个人怎么能很容易地学会这一点(除了24/7编程)?
发布于 2013-01-03 22:11:05
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-03 22:07:47
一般的推理是,如果需要存储,则必须在源文件中定义它。如果它是一个静态的const整数,它不需要存储-编译器可以在任何地方使用这个变量替换一个文字整数。如果它是非静态的,它是一个成员变量,需要存储在每个对象中。如果是非const,则需要在更新时保留值的位置。
https://stackoverflow.com/questions/14147994
复制相似问题