C++ 初始化类的静态常量非整数数据成员

C++ 初始化类的静态常量非整数数据成员,c++,initialization,constants,static-members,C++,Initialization,Constants,Static Members,考虑下面的示例程序: #include <iostream> using namespace std; class test { public: static const float data; }; float const test::data = 10; // Line1 int main() { cout << test::data; cout << "\n"; return 0; } #包括 使用名

考虑下面的示例程序:

#include <iostream>

using namespace std;

class test
{
   public:
      static const float data;
};

float const test::data = 10;   // Line1


int main()
{
   cout << test::data;
   cout << "\n";

   return 0;
}
#包括
使用名称空间std;
课堂测试
{
公众:
静态常量浮点数据;
};
浮点常量测试::数据=10;//第1行
int main()
{
库特
Line1是否正在初始化日期成员数据

Line1是初始化静态常量非整数数据的唯一方法吗 成员

  • 第1行定义静态数据成员
    data
    ,包括设置其值
  • 对于非整数类型的静态数据成员,成员定义确实是唯一可以设置值的地方。对于整数、long、enum等,您可以将值与声明一起放入。您仍然必须包含定义,但在这种情况下,您不能放入任何值

  • <>编辑:正如Mike Seymor指出的,2号是过时的。根据新的C++ 11标准,只由1998和C++ 03标准保留的整数类型的替代语法已经扩展到所有常量,不管它们的类型。在
    class test
    {
       public:
          static constexpr float data = 10.0f;
    };
    
    float constexpr test::data;
    
  • 二,

    在C++11中,您可以说

    class test {
    public:
        constexpr static float data = 10.0; // data is implicitly const
    };
    
    在C++03中,是的

    Line1是否正在初始化日期成员数据

    当然是这样,并且提供了对象的定义。请注意,这只能在单个翻译单元中完成,因此,如果类定义在头文件中,那么它应该在源文件中

    Line1是初始化静态常量非整数数据成员的唯一方法吗


    在C++03中是这样的。在C++11中,
    const
    literal类型的任何静态成员在类定义中都可以有一个初始化器。如果“使用了odr”,则仍然需要该成员的定义(粗略地说,如果您做任何需要其地址而不仅仅是其值的事情)。在这种情况下,定义需要在单个翻译单元中,并且不能有初始值设定项(因为类定义中已经有一个初始值设定项)。

    您的第二个答案已过期。在C++11中,
    const
    literal类型的任何静态成员(不仅仅是整数类型)可以在类定义中初始化。@ MikeSeymour谢谢你指出了这个问题。我已经更新了答案。在过去的十年里我没有在C++中进行大量的编码,所以我错过了新标准的有用细节。再次感谢修正!@ DasBink能提供在类初始化中允许的C++或98的链接或来源。1998年对整型的定义,以及C++03标准对所有常量的引用。我看到很多人告诉他们,但找不到任何真实的引用。这将有助于我向同事演示并告诉他们,无论是现代gcc编译器,我们都可以跳过静态常量int的类内初始化。因为他们不需要存储空间不足。@jrok:这里没有重新声明,只有以前声明的对象的定义。@jrok:是的,你是对的,这只是一个疏忽。修复了!请注意,你甚至可能根本不需要定义。确切地说,定义是不需要的。@jrok:嗯,有时候不需要它。如果你想获取地址,
    &test::dat一个,你需要定义。这取决于你如何使用它,即你只想要值还是实际对象。我想你可以在例子中指定C++版本来改进它。我发现了“当代C++”。误导性,想象一下人们在4-5年内阅读这篇文章;)谢谢。所以如果我在头文件或多个源文件中使用第1行,那么这将是一个错误,因为
    多定义
    对吗?@LinuxPenseur:是的,这是正确的。你将违反“一个定义规则”.C++03将整型与非整型区别对待的基本原理是什么?有人知道吗?