繁体   English   中英

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

[英]Initialize a static const non-integral data member of a class

考虑下面的示例程序:

#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非整数数据成员的唯一方法吗?

Line1是否在进行日期成员数据的初始化?

当然,以及提供对象的定义。 请注意,这只能在单个转换单元中完成,因此,如果类定义在头文件中,则应在源文件中。

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

在C ++ 03中是这样。 在C ++ 11中, const文字类型的任何静态成员都可以在类定义中具有初始化程序。 如果成员是“ odd-used”(仍然使用),则仍然需要一个成员的定义(大致来说,如果您执行任何需要其地址的操作,而不仅仅是其值)。 在这种情况下,定义又需要位于一个转换单元中,并且必须没有初始化程序(因为类定义中已经存在一个初始化程序)。

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

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

float constexpr test::data;
  1. Line1对静态数据成员data 定义 ,包括设置其值。
  2. 对于非整数类型的静态数据成员,成员定义确实是设置值的唯一位置。 对于整数,longs,enums等,可以将值与声明一起放入。 您仍然必须包括定义,但是在这种情况下,您不能输入任何值。

编辑:正如Mike Seymor所指出的,第二名已经过时。 根据新的C ++ 11标准,1998和C ++ 03标准仅为整数类型保留的替代语法已扩展到所有常量,无论其类型如何。

  1. 是。

2。

在C ++ 11中,您可以说

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

在C ++ 03中,是。

Line1是否在进行日期成员数据的初始化?

是。

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

是。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM