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

有关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;

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值