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、成员变量是类类型