本文摘自:http://www.cnblogs.com/sqzxcv/archive/2009/12/02/1615787.html
详情请移步
C++为类中提供类成员的初始化列表
类对象的构造顺序是这样的:
1.分配内存,调用构造函数时,隐式/显示的初始化各数据成员
2.进入构造函数后在构造函数中执行一般计算
1.类里面的任何成员变量在定义时是不能初始化的。也就是
class A
{
int value=0;//错误,类数据成员在类声明时不能进行初始化,一般在构造函数中
}
2.一般的数据成员可以在构造函数中初始化。
3.const数据成员必须在构造函数的初始化列表中初始化。
4.static要在类的定义外面初始化。
5.数组成员是不能在初始化列表里初始化的。
6.不能给数组指定明显的初始化。
这6条一起,说明了一个问题:C++里面是不能定义常量数组的!因为3和5的矛盾。这个事情似乎说不过去啊?没有办法,我只好转而求助于静态数据成员。
到此,我的问题解决。但是我还想趁机复习一下C++类的初始化:
1.初始化列表
//
const int a;
A::A(int i):a(i) {} //类的构造函数定义
//
A a1(100); //函数实现利用构造函数的初始化列表给对象的常数据成员赋初值
2.类外初始化
//
static int count; //类中的静态数据成员声明
//
int A::count=0; //在类外进行初始化定义,定义时不带static关键字
3.若是静态常数据成员,也就是2和3的复合体,如
//
static const int b;
//
const int A::b=1; //随2,都是在类外定义,但const是数据/函数的一部分,要带
4.C++类不能定义常量数组。
关于const,复习一下常量指针:
如果const位于星号的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;如果const位于星号的右侧,const就是修饰指针本身,即指针本身是常量。
在C++类中,必须做如下事情:
1.必须对任何const或引用类型成员以及没有默认构造函数的 类 类型 的任何成员 显示地使用初始化列表进行初始化
2.类成员在定义时是不能被初始化的。
3.类的成员初始化顺序与成员变量在构造函数中的位置选后顺序无关,至于成员变量在类中定义的先后顺序有关。
所以下面的例子是错的:
class x
{
int i;
int j;
public :
x( int value):j(value),i(j) { }
} ;
对与上面的code,因为i先被初始化(i相对于j先定义的)而在i初始化时,j并没有被初始化,故执行出现问题了。