c++ - C++ 中哪里可以声明变量?

标签 c++ c++11

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

"a const static data member is declared in the class and is normally defined (and initialized) in a source file, such as a .cpp file. But in some cases it can be initialized in the class body proper."

然后继续提到可以在何处声明整型和非整型(尽管我认为这对于 C++11 中的整型有所改变)。

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

我开始感到非常困惑,不明白为什么会有这些限制?对于 volatile、mutable 和其他关键字变量有这些规则吗?人们如何才能轻松学习这一点(除了 24/7 进行编程之外)?

最佳答案

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

静态数据成员一般需要定义。但是,staticconst 成员可能会在类主体中逃脱声明和初始化:如果该成员未绑定(bind)到引用或其正在获取的地址,声明就足够了,您不需要提供定义。但是,如果您获取地址,仍然需要定义它。

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

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);

    // ...
};

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

关于c++ - C++ 中哪里可以声明变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14147994/

相关文章:

C# ASCII GetBytes如何设置使用哪个字符进行无法识别的转换?

c++ - 无法从伪终端读取

c++ - FlexeLint/PC-lint 警告不考虑 std::string::append 的返回值

c++ - 为什么 std::move 需要前向引用?

c++ - 编译时 'String' 使用 Variadic 模板进行操作

c++ - 在使用C++的OpenGL中移动形状时按时间自动旋转形状

c++ - 如何在 VC++ 中将 TChar[] 数组转换为 std::string。语法帮助

linux - TCP sendto (C++) 在 Linux 但不是 OSX 上失败。错误号 : EINVAL 22 Invalid argument

c++ - 为什么 std::function 太慢是因为 CPU 无法利用指令重新排序?

c++ - 为非常大的数逼近二项式系数的对数