Appearance
构造函数 Constructor
- 与类同名
- 没有返回值
- 可有参数,可无参数
- 可以不写,编译器会提供一个默认的无参构造
- 相当于申请空间时候的 hook
调用时机
- 栈区:使用类实例化对象,直接调用构造函数
- 堆区:使用指针,不调用构造函数,只使用 new 申请空间,编译器默认调用构造函数
支持重载
- 可有多个构造函数,支持重载
- 可重载默认提供的拷贝构造和移动构造
- 有参构造没初始化的参数会默认随机值
- 如果定义了一个有参构造,默认提供的无参构造会无效
初始化列表
- 构造函数函数体内,一般是实现逻辑功能的,初始化工作放在初始化列表中完成
- 格式在形参列表后面,由冒号引
成员变量1(形参), 成员变量2(形参2)...
cpp
Rect() : length(0), width(0) {
// assignment is not initialization
// this->length = 0;
// this->width = 0;
cout << "no-arg constructor" << endl;
}
Rect(int length, int width): length(length), width(width) {
// this->length = length;
// this->width = width;
cout << "arg constructor" << endl;
}必须使用的情况
- 当形参名和成员变量名重名的时候,可以用初始化列表解决冲突(但是函数体内部还是需要使用
this来区分) - 有
const常量成员变量时,常量成员无法修改,只能在初始化的时候赋值 - 有引用成员变量时,因为引用变量只能在初始化的时候赋值
- 有其他类成员子对象时,该成员必须初始化,所以必须在列表中显示调用其构造函数完成