类中的成员是对象时,就叫类的对象作为成员。
当调用构造函数时,
首先按各对象成员在类定义中的顺序(和参数列表的顺序无关)依
次调用它们的构造函数,
对这些对象初始化,
最后再调用本身的函数体。
也就是说,先调用对象成员的构造函数,
再调用本身的构造函数。
析构函数和构造函数调用顺序相反,先构造,后析构。
下面举例说明:
/****************************************************
* brief : 对象作为成员变量
* author : shao
* date : 2020-02-27
* note : none
*
****************************************************/
#include <iostream>
#include <string>
using namespace std;
class Phone{
public:
string ph_brand; //手机品牌
//手机的默认构造函数
Phone()
{
ph_brand = "小米Note3"; //默认是小米手机
cout << "Phone 的默认构造函数" << endl;
}
Phone(string brand)
{
ph_brand = brand;
cout << "Phone 的有参构造函数" << endl;
}
~Phone()
{
cout << "Phone 的析构函数" << endl;
}
};
class Game{
public:
string g_name; //游戏名字
Game()
{
g_name = "LOL";
cout << "Game 的默认构造函数" << endl;
}
Game(string name)
{
g_name = name;
cout << "Game 的有参构造函数" << endl;
}
~Game()
{
cout << "Game 的析构函数" << endl;
}
};
class Person{
//为了方便,都设置成public权限
public:
string p_name;
Phone p_phone; //手机是一个类
Game p_game; //游戏也是一个类
Person()
{
p_name = "狗蛋";
cout << "Person 的默认构造函数" << endl;
}
//用列表初始化的方式
Person(string name, Phone ph, Game ga):p_name(name), p_phone(ph), p_game(ga)
{
cout << "Person 的有参构造函数" << endl;
}
~Person()
{
cout << "Person 的析构函数" << endl;
}
void showInfo()
{
cout << p_name << "拿着" << p_phone.ph_brand << "手机,玩着"
<< p_game.g_name << "游戏!" << endl;
}
};
void test01(void)
{
/*
* 注:当有成员变量是对象的时候,在调用当对象的构造函数之前。
* 会先调用子对象的构造函数,来实现子对象的实例化。
* 子对象的实例化顺序根据成员变量的顺序来初始化。
* 在退出的时候,进行析构,析构的顺序和构造顺序相反。
*/
Person p1; //先调用Phone的默认构造函数,再调用Game的构造函数,最后调用本实例的构造函数
p1.showInfo();
}
void test02(void)
{
cout << "\n==============华丽的分割线================\n" << endl;
Phone ph("华为Mate30"); //调用Phone的有参构造函数
Game ga("王者荣耀"); //调用Game的有参构造函数
Person p2("二狗蛋",ph, ga);
p2.showInfo();
}
int main(void)
{
test01();
test02();
return 0;
}
结果如下:

本文介绍了C++中类的对象作为成员时的构造和析构顺序。在创建对象时,成员对象会按照它们在类定义中的顺序先进行构造,然后调用自身的构造函数。而在析构过程中,顺序则相反,先执行自身的析构函数,再依次析构成员对象。

1698

被折叠的 条评论
为什么被折叠?



