C++(二十三)之类对象作为成员

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

类中的成员是对象时,就叫类的对象作为成员。

当调用构造函数时,

首先按各对象成员在类定义中的顺序(和参数列表的顺序无关)依
次调用它们的构造函数,

对这些对象初始化,

最后再调用本身的函数体。

也就是说,先调用对象成员的构造函数,

再调用本身的构造函数。


析构函数和构造函数调用顺序相反,先构造,后析构。

 

下面举例说明:

/****************************************************
 * 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;
} 

结果如下:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值