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

时间:2022-09-09 15:06:32

有关const成员、static成员、const static成员的初始化:

1、const成员:只能在构造函数后的初始化列表中初始化

2、static成员:初始化在类外且不加static修饰

3、const static成员:类只有唯一一份拷贝,且数值不能改变。因此,可以在类中声明处初始化,也可以像static在类外初始化

示例: 

#include <iostream>
using std::cout;
using std::endl;
class base
{
public:
base(int x=8):a(x){};//const成员在构造函数初始化
const int a;
static int b;
const static int c=9;//const static成员在类内初始化
};
int base::b=9;//static成员在类外初始化,可以修改
//const int base::c=10;//也可以像static在类外初始化
int main()
{
base obj;
cout<<obj.a<<endl;
cout<<base::b<<endl;
cout<<base::c<<endl;
}


如果你想初始化一个类中的常量数据成员,只能用一种方法,在构造函数后的初始化列表中初始化;

类中的静态成员只有常量整数(不局限于int,如:short等)可以申明和定义一并出现,否则只能申

 

实例见:http://blog.csdn.net/liuxialong/article/details/6573025

 

C++标准 9.4.2.4 是这么说的:

If a static data member is of const integral or const enumeration type, its decalaration in the class can specify a constant-initializer which shall be an integral constant expression.

可以看到,对类中的数据成员进行初始化的条件是:
1. 必须是一个(static)静态成员。对于非静态成员不能在类定义中进行初始化。
2. 静态成员的声明中必须是有 const 限定。非 const 的静态成员不能在类定义中进行初始化。
3. 静态成员的类型必须为整型或者是枚举型。其它类型(如浮点型、数组、指针等)不能在类定义中进行初始化。
4. 只能使用一个整型常量表达式(integral constant expression)来进行初始化。


一个编译器应该对于违反上述任何一条的程序进行报错(error)或者最低限度是警告(warning)处理,否则就是编译器的失职。

标准中还对特别指出了什么不能作为整型常量表达式(integral constant-expression):

In particular, except in sizeof expressions, functions, class objects, pointers, or references shall not be used.

因此,函数(function)等非整型常量表达式,用来初始化类定义中的整型常量静态成员是非法的。

如果编译器对此不报错,说明编译器对标准的支持还有待提高。

 

 

类中    static const double PI=3.1416;

error:只有静态常量整型数据成员才可以在类中初始化 常整型静态数据成员可以在类中直接初始化,而常实型静态数据成员不可以   class circle { int a; // 普通变量,不能在类中初始化 static int b; // 静态变量,不能在类中初始化 static const int c=2; // 静态常量,可以在类中初始化 static const double PI=3.1416;//error C2864: 只有静态常量整型数据成员才可以在类中初始化 } ;   b可以在类外进行初始化,且所有对象共享一个b的值: int circle::b = 2;