初始化类的静态const非整数数据成员

时间:2011-12-13 14:01:16

标签: c++ initialization const 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;
}

请注意示例代码中的评论Line1

问题:

  1. Line1是否正在初始化日期成员data
  2. Line1是初始化静态const非整数数据成员的唯一方法吗?

5 个答案:

答案 0 :(得分:8)

  

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

当然,除了提供对象的定义之外。请注意,这只能在单个翻译单元中完成,因此如果类定义位于头文件中,则应该在源文件中。

  

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

在C ++ 03中它是。在C ++ 11中,const文字类型的任何静态成员都可以在类定义中具有初始化。你仍然需要一个成员的定义,如果它是“odr-used”(粗略地说,如果你做任何需要它的地址,而不仅仅是它的价值)。在这种情况下,定义再次需要在单个翻译单元中,并且不能具有初始化(因为类定义中已经有一个)。

答案 1 :(得分:4)

  1. Line1执行静态数据成员data定义,其中包括设置其值。
  2. 对于非整数类型的静态数据成员,成员定义确实是设置值的唯一位置。对于整数,长整数,枚举等,您可以使用声明输入值。您仍必须包含定义,但在这种情况下,您不得包含任何值。
  3. 编辑:正如Mike Seymor指出的那样,#2已经过时了。根据新的C ++ 11标准,1998和C ++ 03标准仅为整数类型保留的替代语法已扩展到所有常量,无论其类型如何。

答案 2 :(得分:4)

在现代C ++中,您可以初始化任何常量表达式内联。这需要更改语法:

class test
{
   public:
      static constexpr float data = 10.0f;
};

float constexpr test::data;

答案 3 :(得分:2)

  1. 2

    在C ++ 11中,你可以说

    class test {
    public:
        constexpr static float data = 10.0; // data is implicitly const
    };
    

    在C ++ 03中,它是的。

答案 4 :(得分:0)

  

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

  

Line1是初始化静态const非整数数据的唯一方法   构件?