构造函数初始化列表
与普通构造函数的区别
构造函数初始化列表用于在显式初始化类成员。在平常的使用构造函数创建对象时,如果对象中将另一个对象作为成员,那么在调用构造函数之前,编译器会用成员对象的默认构造函数进行初始化。如果不想让编译器用默认的构造函数进行初始化,就要使用构造函数初始化列表来显式规定成员对象的初始化形式。
构造函数进行的操作是,将成员先初始化,再用给定值赋值给初始化后的成员,而构造函数初始化列表则是直接对成员进行初始化,两者之间的区别跟下面两种创建变量的方式区别类似:
//在创建的时候直接初始化,相当于构造函数初始化列表
int x = 3;
//先创建x,再赋值给x,相当于普通构造函数的初始化方式
int x;
x = 3;
防止非内置类型二次创建
对于内置类型,两种方式的初始化方法都是一样的效果。但是对于成员是一个对象的情况,则会有很大的区别,它会导致对成员对象进行多次不必要的复制,进而降低运行效率。有些时候如果管理不当,甚至会导致内存泄漏,更严重的是内存混乱,从而程序崩溃。下面的例子展示了这样的情况:
class Car{
private:
char * brand;
double price;
public:
Car(){
cout << "Using default constructor for Car." << endl;
brand = new char[3];