本例程探讨:
1 在类B中组合了其它类A的对象时,构造函数和析构函数的调用顺序
2 如何在定义类B的对象时,通过构造函数初始化列表,初始化其组合的类A的对象。
#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 ;
};
//构造函数初始化列表 解决:在B类中 组合两个A类对象(A类设计了构造函数)
//根据构造函数的调用规则,写了A的构造函数,必须要用,但现有语法没有机会初始化A
//其实质:新的语法 构造函数初始化列表派上用场
class B
{
public:
//在B的构造函数中写上a的构造函数
B(int _b1 ,int _b2):a1(1),a2(2),c(0)
{
b1 = _b1 ;
cout << "b1 " << b1 << endl ;
b2 = _b2 ;
cout << "b2 " << b2 << endl ;
}
B(int _b1 ,int _b2, int m , int n):a2(m),a1(n),c(0)
{
b1 = _b1 ;
cout << "b1 " << b1 << endl ;
b2 = _b2 ;
cout << "b2 " << b2 << endl ;
}
~B()
{
cout << "B的析构函数" << endl ;
}
private:
int b1 ;
int b2 ;
A a1 ;
A a2 ;
const int c ;
};
//构造函数执行顺序:
//先执行 被组合对象的构造函数,如果组合对象有多个 按照定义的顺序调用,而不是按照初始化列表的顺序
//析构函数:和构造函数的调用顺序相反
void objplay()
{
// A a1(10);
// B b1(3,4) ;
//1 参数传递
B b2(1,2,3,4) ;// b1 b2 a2 a1
//2 构造函数调用顺序为 a1=4, a2=3, b1, b2
//3 析构函数调用顺序 b2, b1, a2, a1
}
void main()//构造函数初始化列表
{
objplay() ;
system("pause");
}