[C++] 构造函数初始化列表

C++ 类中构造函数中成员变量的初始化方式有两种:

1、构造函数体内(常用方式)

class Student {
private:
    int a;
    int b;
public:
    // 错误,只是将a/b赋给形参,没有赋值给成员变量
    explicit Student(int a, int b) {
        a = a;
        b = b;
    }
    // 正确
    explicit Student(int a, int b) {
        this->a = a;
        this->b = b;
    }
    // 正确
    explicit Student(int a1, int b1) {
        a = a1;
        b = b1;
    }
};

2、构造函数初始化列表

class Student {
private:
    int a;
    int b;
public:
    // 按照成员变量定义的顺序赋值,而不是冒号后的顺序
    // 下面两种方式意义相同
    explicit Student(int a, int b) : a(a), b(b) {
//  explicit Student(int a, int b) : b(b), a(a) {
        cout << a << ' ' << b << endl;
    }
};

这两种方式,对于基本类型成员没有区别,但是对复杂类型成员(比如类,结构体等),第二种效率更高,第一种会调用一次默认的构造函数,在类构造函数里又会调用一次成员的构造函数再赋值;第二种仅在初始化列表里调用一次成员的构造函数并赋值。

下面情况必须使用初始化列表:

1、在派生类中构造函数中初始化提供父类的初始化

2、如果成员是常量或引用,成员无法使用赋值的方式,只能在初始化列表中初始化

3、成员变量是类类型

原文地址:https://www.cnblogs.com/lialong1st/p/12060592.html