列表初始化要比赋值初始化效率高,养成好习惯使用初始化列表哟 !而且对于const修饰的变量和引用型变量必须用这种方式初始化
列表初始化的顺序:
初始化的顺序与列表中书写的顺序无关,与继承的顺序(不写父类初始化说明调用了默认构造函数)和变量声明的顺序相同!!
派生类构造函数的调用次序:(先虚基类,后基类,再成员对象,最后自身)
(1)对虚基类间的构造函数的顺序:根据虚基类间继承的顺序调用
(2)对基类间的构造函数的顺序:根据基类间继承的顺序调用
(3)对成员对象的构造函数的顺序:根据成员对象在类中声明顺序调用
(4)若同一层次中包含多个虚基类,这些虚基类的构造函数按它们说明的次序调用;
(5)若虚基类由非虚基类派生而来,则仍先调用基类构造函数,再调用派生类的构造函数.
#include <iostream>
using namespace std;
class Base1
{
private:
int n;
public:
Base1(int m):n(m){ cout<<"Base1 构造函数"<<"n="<<n<<endl;}
};
class Base2
{
private:
int n;
public:
Base2(int m):n(m){ cout<<"Base2 构造函数"<<"n="<<n<<endl;}
};
class Base3
{
private:
int n;
public:
Base3(int m):n(m){ cout<<"Base3 构造函数"<<"n="<<n<<endl;}
};
class Derive:public Base1,public Base2,virtual Base3
{
private:
Base1 b1;
Base2 b2;
public:
Derive(int m,int n):b2(n),b1(n),Base1(m),Base2(m),Base3(m) //列表故意写的很乱
{
cout<<"Derive 构造函数"<<endl;
}
};
int main()
{
Derive d(1,2);
return 0;
}
运行结果: