对象初始化列表
1)对象初始化列表出现的原因
必须这样做 如果我们有一个类成员,它本身是一个类或者是一个结构,而且这个成员它只有一个带参数的构造函数,没有默认构造函数,这时要对这个类成员进行初始化,就必须调用这个类型员的带参数的构造函数。如果没有初始化列表,那么他将无法完成第一步。
#include<iostream>
using namespace std;
class A
{
public:
A(int a)
{
m_a = a;
}
public:
int getA()
{
return m_a;
}
private:
int m_a;
};
//构造函数的初始化列表,解决:在B类中,组合了一个A类对象(A类设计了构造函数)
//根据构造函数的调用规则,设计A的构造函数,必须要用,没有机会初始化A
//新的语法 constructer::constructer():m1(v1),m2(v1,v2),m3(v3)
class B
{
public:
B(int m1,int m2) :a3(10), a4(11)
{
m_b1 = m1;
m_b2 = m2;
}
B(int m1, int m2, int m3, int m4) :a3(m3), a4(m4)
{
m_b1 = m1;
m_b2 = m2;
}
public:
int getB1()
{
return m_b1;
}
int getB2()
{
return m_b2;
}
int getA3()
{
return a3.getA();
}
int getA4()
{
return a4.getA();
}
private:
int m_b1;
int m_b2;
A a3;
A a4;
};
int main()
{
A a1(10);
//B b1(8,9);
B b1(1, 2, 3, 4);
cout << b1.getB1()<<b1.getB2()<<b1.getA3()<<b1.getA4()<< endl;
system("pause");
}
构造函数的执行顺序
#include<iostream>
using namespace std;
class A
{
public:
A(int a)
{
m_a = a;
cout << "构造函数a"<<m_a<< endl;
}
~A()
{
cout << "析构函数a"<<m_a<< endl;
}
private:
int m_a;
};
class B
{
public:
B(int m1, int m2, int m3, int m4) :a1(m3), a2(m4)
{
b1 = m1;
b2 = m2;
cout << "构造函数b"<<b1<< endl;
}
~B()
{
cout << "析构函数b"<<b1<< endl;
}
private:
int b1;
int b2;
A a1;
A a2;
};
//先执行 被组合对象的构造函数
//如果组合对象有多个 按照定义顺序
//析构函数与构造函数的调用顺序相反
//被组合对象的构造顺序与定义顺序有关系 与初始化列表的顺序没有关系
void objplay()
{
B b1(1, 2, 3, 4);
}
void main()
{
objplay();
system("pause");
}
附结果