成员的初始化列表和构造函数在对成员指定初值方面是不一样的。成员初始化列表是对成员初始化,而构造函数,是对成员赋值
- 成员初始化列表使用初始化的方式来为数据成员指定初值,
- 而构造函数的函数体是通过赋值的方式来给数据成员指定初值。
- 成员初始化列表是在数据成员定义的同时赋初值,
- 但是构造函的函数体是采用先定义后赋值的方式来做。
这样就限制了,有些情况必须用成员初始化列表。
在这四种情况下是必须要使用成员初始化列表来为这些类型的成员赋初值的:
- 初始化一个引用成员变量
- 初始化一个const变量
- 当我们在初始化一个子类对象的时候,而这个子类对象的父类有一个显示的带有参数的构造函数
- 当调用一个类类型成员的构造函数,而它拥有一组参数的时候
#include <iostream> using namespace std; class A { public: A(int _a) { a = _a; cout << "构造函数" << "a" << a << endl; } ~A() { cout << "析构函数" << "a" << a << endl; } protected: private: int a; }; //1 构造函数的初始化列表 解决: 在B类中 组合了一个 A类对象 (A类设计了构造函数) //根据构造函数的调用规则 设计A的构造函数, 必须要用;没有机会初始化A //新的语法 Constructor::Contructor() : m1(v1), m2(v1,v2), m3(v3) class B { public: B(int _b1, int _b2) : a1(1), a2(2), c(0) { } B(int _b1, int _b2, int m, int n) : a1(m), a2(n), c(0) { b1 = _b1; b2 = _b2; cout <<"B的构造函数"<<endl; } ~B() { cout<<"B的析构函数" <<endl; } protected: private: int b1; int b2; A a2; A a1; const int c; }; //2 先执行 被组合对象的构造函数 //如果组合对象有多个,按照定义顺序, 而不是按照初始化列表的顺序 //析构函数 : 和构造函数的调用顺序相反 //3 被组合对象的构造顺序 与定义顺序有关系 ,与初始化列表的顺序没有关系. //4 初始化列表 用来 给const 属性赋值 void obj10play() { //A a1(10); //B ojbB(1, 2); //1参数传递 B ojbB2(1, 2,3, 4); //2 调用顺序 return ; } void main100() { obj10play(); system("pause"); }
,但是如果仅仅只是一些内置数据类型的话,成员初始化列表和构造函数体的使用是没有什么区别的。