构造函数与析构函数

构造函数和析构函数是类中的两个比较特殊的成员函数,其实现与普通成员函数无异。但是声明有所区别。

构造函数没有返回值类型,其名称与类相同,可以携带参数。携带的参数可以在创建实例时传入。构造函数可以采用构造列表的方式来初始化成员变量,其格式可参考以下示例。

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关键字只能标记在单参数构造函数前,在其他构造函数前使用没有意义。