类对象作为类成员(5)
C++中类的成员可以是另一个类的对象,我们称该成员为 对象成员
创建的顺序和构造的顺序是重点!
1 class A {} 2 class B 3 { 4 A a; 5 };
B类中有A作为成员,A为 对象成员
那么当创建B对象时,A和B的构造顺序是谁先谁后?(我初步猜测是A!因为A最先创建对象)
那么当创建B对象时,A和B的析构顺序是谁先谁后?
验证一下:
1 #include <iostream> 2 #include <string> 3 using namespace std; 4 5 //类对象作为类成员 6 //手机类 7 class Phone 8 { 9 public: 10 11 Phone(string pName):m_PName(pName) 12 { 13 cout << "Phone的构造函数调用!" << endl; 14 } 15 16 ~Phone() 17 { 18 cout << "Phone的析构函数调用!" << endl; 19 } 20 21 string m_PName; 22 }; 23 24 //人类 25 class Person 26 { 27 public: 28 29 //m_Phone(pname)等价于Phone m_Phone = Phone(pName)(有参构造函数)等价于Phone m_Phone = pName 隐式转换法 30 Person(string name, string pname):m_Name(name),m_Phone(pname)//所以没有报错 31 { 32 cout << "Person的构造函数调用!" << endl; 33 } 34 35 ~Person() 36 { 37 cout << "Person的析构函数调用!" << endl; 38 } 39 40 string m_Name; 41 Phone m_Phone;//这是一个对象成员(类) 42 }; 43 44 //结论:当其他类对象作为本类成员,构造的时候先构造其他类的对象,在构造自身,析构顺序?析构的顺序与构造相反! 45 //结论:Phone类对象m_Phone作为Person类的成员,构造的时候先构造m_Phone,再构造Person(构造==构造函数!) 46 void test_01(void) 47 { 48 Person p("张三", "苹果"); 49 50 cout << p.m_Name << "使用的是" << p.m_Phone.m_PName << "手机!" << endl; 51 } 52 53 int main(void) 54 { 55 test_01(); 56 57 system("pause"); 58 return 0; 59 }
咱们怎么去理解呢?
根据前面的经验:谁先创建对象,谁的构造函数最先被调用。
析构的顺序:构造函数先被调用的最后释放。