构造与析构调用顺序:
#include <stdio.h>class Test9_1
{
public:Test9_1 (int a){m_a = a;printf ("9_1 1111111111111111111构造函数....a: %d\n", a);}// 析构的顺序和构造的顺序相反,先构造的后析构~Test9_1(){printf ("9_1 1111111111111111111析构函数....a: %d\n", m_a);}
private:int m_a;
};// 对象初始化列表,解决一个类中有另一个没有无参构造的类的对象的初始化
class Test9_2
{
public:// 对象初始化列表,在构造函数后面加:,后面加上要初始化的对象// 对象初始化列表要比当前类的构造函数先执行// 对象的初始化先后顺序和 在对象初始化列表 的顺序无关,和在类中的声明先后顺序有关 Test9_2():m_a(10), m_c(30), m_b(20), m_ca(100){printf ("9_2 222222222222构造函数....\n");}~Test9_2(){printf ("9_2 222222222222构造函数....a: %d\n", m_ca);}
private:Test9_1 m_b;Test9_1 m_c;Test9_1 m_a;const int m_ca;
};int main9_1()
{// 类中有了构造函数以后,就没有默认的无参构造// Test9_1 a;Test9_2 a;return 0;
}
以及构造中调用构造:
#include <stdio.h>class Test10_1
{
public:// 构造函数中调用构造函数 不会达到预期的效果的Test10_1(int a, int b){m_a = a;m_b = b;Test10_1(a, b, 30); // 匿名对象、临时对象}Test10_1 (int a, int b, int c){m_a = a;m_b = b;m_c = c;}~Test10_1(){printf ("析构*******a = %d, b = %d, c = %d\n", m_a, m_b, m_c);}void print (){printf ("a = %d, b = %d, c = %d\n", m_a, m_b, m_c);}
private:int m_a;int m_b;int m_c;
};int main10_1()
{// Test10_1(10,20); // 临时对象 生命周期就是这一行Test10_1 a(10,20);a.print();printf ("--------------------------------\n");return 0;
}