为什么要使用初始化列表?
原因1:有些成员变量比如const类型的和引用类型的他们必须初始化,而正常调用构造函数的时候是对成员变量进行赋值,而不是初始化,这样它们就会报错!!
原因2:类成员,比如说在类A里面定义类B的成员,如果类B有构造函数的话,系统将不会提供默认无参构造函数,那么如果不用初始化列表的话就会报错。
原因3:使用初始化列表会比正常赋值高效一些
1.初始化列表只能在构造函数中使用
因为对象的初始化只发生在对象创建的时候,而对象创建的时候会调用构造函数
构造函数的执行又俩个阶段
1.初始化阶段:无论成员变量是否在初始化列表中,都会进行初始化
2.赋值阶段:根据函数体里面内容进行赋值
2.成员变量初始化的顺序只于它在类中声明的顺序有关,与初始化列表的顺序无关
int _a; int _b; int _c; A(int a, int b, int c) :_b(b),_a(_b), _c(c) {//初始化列表 cout << _a << " " << _b << " " << _c << endl; } A(1, 2, 3);
3.const常量、引用和类成员必须在初始化列表中初始化
因为他们三必须创建的时候就进行初始化!!!
首先const类型的变量和引用类型都必须进行初始化操作,否则会报错
类对象做类成员
先调用类成员的构造函数,再调用本类的构造函数,最后先调用本类的析构函数,再调用类成员的析构函数
#include <iostream> using namespace std; class A { int a; int b; int c; public: A(int _a, int _b, int _c) { a = _a; b = _b; c = _c; cout << "调用A的构造函数" << endl; } ~A() { cout << "调用A的析构函数" << endl; } }; class B { int x1; int x2; const int cn; int& m; A s; public: B(int _x1,int _x2,int _cn, int _m, int _a, int _b, int _c) :cn(_cn), m(_m), s(_a, _b, _c) { x1 = _x1; x2 = _x2; cout << "调用B的构造函数" << endl; } ~B() { cout << "调用B的析构函数" << endl; } }; int main() { int x = 1; B b(6,7,1, x, 2, 3, 4); return 0; }