无参构造函数
只有当类没有声明任何构造函数时,编译器才会自动地生成默认构造函数。
一般构造函数
基于函数重载,可以有各种参数形式的构造函数
复制构造函数
复制构造函数必须是传引用的,因为使用传值参数时,把形参复制到实参会调用复制构造函数,会导致无休止的递归调用而栈溢出。 如果未显示给出,系统会默认创建一个复制构造函数,该复制构造函数是浅拷贝。 浅拷贝:只是对指针的拷贝,拷贝后两个指针指向同一个内存空间,在对象复制时,只是对对象中的数据成员进行简单的赋值,如果对象中存在动态成员,即指针,浅拷贝就会出现问题。 深拷贝:不但对指针进行拷贝,而且对指针指向的内容进行拷贝,经深拷贝后的指针是指向两个不同地址的指针。
类型转换构造函数
根据一个指定的类型的对象创建一个本类的对象
等号运算符重载
这个类似复制构造函数,将=右边的本类对象的值复制给等号左边的对象,它不属于构造函数,等号左右两边的对象必须已经被创建。 运算符重载函数为值返回时会产生临时变量,该临时变量会调用复制构造函数。如果运算符重载返回的是引用,则不会调用复制构造函数。返回引用的函数是可以作为左值参与运算的(单目运算符)。
构造函数初始化列表:
在构造函数初始值列表中是初始化,构造函数体中是赋值。对于部分数据成员,如const与引用类型,必须在通过初始化列表进行初始化。
成员的初始化顺序与它们在类定义中的出现顺序一致。
构造函数的异常处理:
关键字try出现在表示构造函数初始值列表的冒号以及表示构造函数体的花括号之前。
派生类的构造函数:
首先初始化基类的部分,然后按申明的顺序依次初始化派生类的成员。
每个类控制它自己的成员初始化过程,派生类构造函数只初始化它的直接基类
静态成员初始化 -> 类继承部分(初始化列表中可调用类不同的构造函数) -> 成员变量声明部分
1. 静态成员初始化
先执行静态成员的构造函数,如果静态成员只是在类定义中声明了,而没有实现,是不会调用构造函数的。必须初始化后才执行其构造函数。
2. 类继承部分
虚继承(从左到右按声明顺序构造) -> 正常继承(从左到右按声明顺序构造)
初始化列表中可以决定继承部分具体调用哪个构造函数
3. 成员变量声明部分
按声明顺序构造
4. 类自己的构造函数体
构造函数不能声明为虚函数:
1. 构造一个对象的时候,必须知道对象的实际类型,而虚函数行为是在运行期间确定实际类型的。
2. 虚函数的执行依赖于虚函数表。而虚函数表在构造函数中进行初始化工作,即初始化vptr,让他指向正确的虚函数表。