构造函数与析构函数
构造函数和析构函数是类中的两个比较特殊的成员函数,其实现与普通成员函数无异。但是声明有所区别。
构造函数没有返回值类型,其名称与类相同,可以携带参数。携带的参数可以在创建实例时传入。构造函数可以采用构造列表的方式来初始化成员变量,其格式可参考以下示例。
class Car {
private:
int seats;
int wheels;
public:
Car(int m_seats, int m_wheels): seats(m_seats), wheels(m_wheels);
}
析构函数也没有返回值类型,名称与类相同,但在前面添加了~
前缀,析构函数不接受任何参数。
如果一个类需要显式声明析构函数,那么它也需要重载
=
操作符和从其他同类型实例复制内容的构造函数(例如ClassA(const ClassA&)
的构造函数)。
构造函数和析构函数可以参考前面示例中的Car
类。
在类存在有单参数构造函数时,C++会使用隐式类型转换,例如以下示例是不会报错的。
class Example {
public:
Example(bool _value): active(_value) {}
Example(const Example& _instance) { this->active = _instance.active; }
private:
bool active;
}
// 以下调用均会成功
Example a = false;
Example b{3};
为了防止 C++隐式调用单参数构造函数,就需要借助于explicit
关键字来进行标记。将上例代码改为以下格式后,之前的调用就不会成功了。
class Example {
public:
explicit Example(bool _value): active(_value) {}
explicit Example(const Example& _instance) { this->active = _instance.active; }
private:
bool active;
}
explicit
关键字只能标记在单参数构造函数前,在其他构造函数前使用没有意义。