前面也说道了,C++的编译器会给每个类都默默的声明了一个无参数的构造函数和一个拷贝构
造函数。当然用户可以给类再增加很多带参数的构造函数,但往往不会再增加另外的拷贝构
造函数。
谈到构造函数,绝对不能忽视它的初始化。构造函数的初始化,可以在函数体内,也可以使
用初始化列表,但是我们常常建议使用初始化列表,为什么呢?有这么几个缘故吧。
1、类的const常量只能在初始化表里被初始化,因为它不能在函数体内用赋值的方式来初始
化。
请看下面的例子程序:
class A
{
const int SIZE = 100; // 错误,企图在类声明中初始化const数据成员
int array[SIZE]; // 错误,未知的SIZE
};
上述的用法绝对是错误的,const数据成员的初始化只能在类构造函数的初始化表中进行,例
如。
class A
{
A(int size); // 构造函数
const int SIZE ;
};
A::A(int size) : SIZE(size) // 构造函数的初始化表
{
}
A a(100); // 对象 a 的SIZE值为100
A b(200); // 对象 b 的SIZE值为200
当然,这个const常量很明显,随着对象的不同,初始化出来的值也不同,那怎样才能建立在
整个类中都恒定的常量呢?别指望const数据成员了,应该用类中的枚举常量来实现。例如
class A
{
enum { SIZE1 = 100, SIZE2 = 200}; // 枚举常量
int array1[SIZE1];
int array2[SIZE2];
};
枚举常量不会占用对象的存储空间,它们在编译时被全部求值。枚举常量的缺点是:它
的隐含数据类型是整数,其最大值有限。
2、如果类存在继承关系,派生类必须在其初始化表里调用基类的构造函数。例如:
class A
{
A(int x);
};
class B:public A
{
B(int x, int y);
}
B:B(int x, int y)
:A(x) //在B的初始化列表中,调用A的构造函数
3、初始化列表和函数体内赋值,其效率不完全相同。此处就不举例说明了。