有些成员变量的数据类型比较特别,它们的初始化方式也和普通数据类型的成员变量有所不同。这些特殊的类型的成员变量包括:
a. 常量型成员变量,如:const int i;
b. 引用型成员变量 如:int &i;
c. 静态成员变量 .如:static int i;
d. 整型静态常量成员变量 如:static const int i;
e. 非整型静态常量成员变量 如:static const double i;
对于常量型成员变量和引用型成员变量的初始化,必须通过构造函数初始化列表的方式进行。在构造函数体内给常量型成员变量和引用型成员变量赋值的方式是行不通的。
静态成员变量的初始化也颇有点特别。
参考下面的代码以及其中注释:
// Initialization of Special Data Member
#include <iostream>
using namespace std;
class BClass
{
public://此处i为一般的常量,ci为常量变量,ri为阴影成员变量,仅i可以再构造函数内初始化
BClass() : i(1), ci(2), ri(i) // 对于常量型成员变量和引用型成员变量,必须通过
{ // 参数化列表的方式进行初始化。在构造函数体内进
} // 行赋值的方式,是行不通的。
void print_values()
{
cout << "i =/t" << i << endl;
cout << "ci =/t" << ci << endl;
cout << "ri =/t" << ri << endl;
cout << "si =/t" << si << endl;
cout << "csi =/t" << csi << endl;
cout << "csi2 =/t" << csi2 << endl;
cout << "csd =/t" << csd << endl;
}
private:
int i; // 普通成员变量
const int ci; // 常量成员变量
int &ri; // 引用成员变量
static int si; // 静态成员变量
//static int si2 = 100; // error: 只有静态常量成员变量,才可以这样初始化
static const int csi; // 静态常量成员变量
static const int csi2 = 100; // 静态常量成员变量的初始化(Integral type) (1)
static const double csd; // 静态常量成员变量(non-Integral type)
//static const double csd2 = 99.9; // error: 只有静态常量整型数据成员才可以在类中初始化
};
// 静态成员变量的初始化(Integral type)
int BClass::si = 0;//不能写成int static BClass::si=0;即不能出现stataic
// 静态常量成员变量的初始化(Integral type)
const int BClass::csi = 1;//此处也一样,要么在定义时初始化,要么在此处初始化,但不能加stataic
// 静态常量成员变量的初始化(non-Integral type)
const double BClass::csd = 99.9;//同上
int main(void)
{
BClass b_class;
b_class.print_values();
return 0;
}