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

nit*_*ian 8 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;
}
Run Code Online (Sandbox Code Playgroud)

请注意Line1示例代码中的注释.

问题:

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

Mik*_*our 8

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

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

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

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

  • @LinuxPenseur:是的,这是正确的.你将打破"一个定义规则". (2认同)
  • 在这里,C++ 03处理整数类型的理由与非整数类型不同?谁知道? (2认同)

Ker*_* SB 5

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

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

float constexpr test::data;
Run Code Online (Sandbox Code Playgroud)