【C++】构造函数初始化列表 ② ( 构造函数 为 初始化列表 传递参数 | 类嵌套情况下 的 构造函数 / 析构函数 执行顺序 )

2023-09-18 23:01:27





一、构造函数 为 初始化列表 传递参数




1、构造函数参数传递


构造函数 初始化列表 还可以使用 构造函数 中的参数 ;

借助 构造函数 中的参数列表 , 可以为 初始化列表 传递参数 ;


在下面的代码中 , B 类的 有参构造函数 , 传入了 3 个参数 , 这三个参数都不在函数体中使用 , 而是在 参数列表中使用 ,

	// 构造函数中的参数可以作为
	B(int age, int ageOfA, int heightOfA) : m_age(age), m_a(ageOfA, heightOfA)
	{}
  • m_age(age) 表示为 m_age 成员变量 赋值 构造函数参数中的 age 参数 ;
  • m_a(ageOfA, heightOfA) 表示调用 A 的有参构造函数 , 传入的 2 个参数分别是 构造函数中的 int ageOfA, int heightOfA 两个参数 ;

代码示例 :

class B
{
public:
	B() : m_age(10), m_a(10, 150)
	{}

	// 构造函数中的参数可以作为
	B(int age, int ageOfA, int heightOfA) : m_age(age), m_a(ageOfA, heightOfA)
	{}
public:
	int m_age;		// 年龄
	A m_a;			// A 类型成员变量
};

调用上述 有参构造函数 , 传入参数即可 ;

	// 通过 B 的有参构造函数
	// 其中 构造函数中的参数 作为 参数列表 中的参数值
	B b(10, 10, 150);

2、代码示例 - 构造函数参数传递


下面的代码中 , 类 A 定义了 2 个参数的 有参构造函数 ;

类 B 定义了 无参构造函数 , 但是在该 无参构造函数 中 , 定义了函数列表 B() : m_age(10), m_a(10, 150) , 在该函数列表中 , 执行了 A 的构造函数 ;

类 B 中还定义了 有参构造函数 , 接收 3 个参数 , 分别作为 m_age 成员的值 , 和 A 类型成员对象的 有参构造函数 的 2 个参数 , 这是 使用了 构造函数 向 初始化列表 的 参数传递 机制 ;


代码示例 :

#include "iostream"
using namespace std;

class A
{
public:
	// 带参构造函数
	A(int age, int height)
	{
		m_age = age;
		m_height = height;
	}

public:
	int m_age;		// 年龄
	int m_height;	// 身高
};

class B
{
public:
	B() : m_age(10), m_a(10, 150)
	{}

	// 构造函数中的参数可以作为 参数列表 中的参数值
	B(int age, int ageOfA, int heightOfA) : m_age(age), m_a(ageOfA, heightOfA)
	{}
public:
	int m_age;		// 年龄
	A m_a;			// A 类型成员变量
};


int main()
{
	// 通过 B 的有参构造函数
	// 其中 构造函数中的参数 作为 参数列表 中的参数值
	B b(10, 10, 150);


	// 控制台暂停 , 按任意键继续向后执行
	system("pause");
	return 0;
}

执行结果 :
在这里插入图片描述





二、类嵌套情况下 的 构造函数 / 析构函数 执行顺序




1、构造函数 / 析构函数 执行顺序


类 B 中 定义了 A 类型 的 成员变量 ;

A 类型对象 是 被组合对象 ;


构造函数执行顺序 :

在 初始化 B 类型 实例对象时 , 先执行 被组合对象 A 的构造函数 ,

如果 被组合对象 有多个 , 则 按照 成员变量 的定义顺序 进行初始化 ;

注意 : 此处 不是按照 初始化列表 的顺序 进行初始化 ;


析构函数执行顺序 :

析构函数 与 构造函数 的执行顺序 相反 ;


2、代码示例 - 构造函数执行顺序


下面的代码中 , 在 B 类中定义 A 类型 成员变量 ;

执行构造函数时 , 先调用 A 的构造函数 , 再调用 B 的构造函数 ;

执行析构函数时 , 与构造函数顺序相反 , 先执行 B 的析构函数 , 再执行 A 的析构函数 ;


代码示例 :

#include "iostream"
using namespace std;

class A
{
public:
	// 带参构造函数
	A(int age, int height)
	{
		m_age = age;
		m_height = height;
		cout << "执行 A 的构造函数" << endl;
	}

	~A()
	{
		cout << "执行 A 的析构函数" << endl;
	}

public:
	int m_age;		// 年龄
	int m_height;	// 身高
};

class B
{
public:
	B() : m_age(10), m_a(10, 150)
	{}

	// 构造函数中的参数可以作为 参数列表 中的参数值
	B(int age, int ageOfA, int heightOfA) : m_age(age), m_a(ageOfA, heightOfA)
	{
		cout << "执行 B 的构造函数" << endl;
	}

	~B()
	{
		cout << "执行 B 的析构函数" << endl;
	}
public:
	int m_age;		// 年龄
	A m_a;			// A 类型成员变量
};


int main()
{
	// 通过 B 的有参构造函数
	// 其中 构造函数中的参数 作为 参数列表 中的参数值
	B b(10, 10, 150);


	// 控制台暂停 , 按任意键继续向后执行
	system("pause");
	return 0;
}

执行结果 :

执行 A 的构造函数
执行 B 的构造函数
请按任意键继续. . .
执行 B 的析构函数
执行 A 的析构函数

在这里插入图片描述

更多推荐

Jenkins自动化测试

学习Jenkins自动化测试的系列文章RobotFramework概念RobotFramework安装Pycharm+RobotFramework环境搭建RobotFramework介绍Jenkins自动化测试1.RobotFramework概念RobotFramework是一个基于Python的,可扩展的关键字驱动的

nginx配置指南

nginx.conf配置找到Nginx的安装目录下的nginx.conf文件,该文件负责Nginx的基础功能配置。配置文件概述Nginx的主配置文件(conf/nginx.conf)按以下结构组织:配置块功能描述全局块与Nginx运行相关的全局设置events块与网络连接有关的设置http块代理、缓存、日志、虚拟主机等

RISV-V架构的寄存器介绍

1、RISC-V的通用寄存器(1)在编写汇编代码时,使用寄存器的ABI名字,一般不直接使用寄存器的编号;(2)x0-x31是用来做整形运算的寄存器,f0-f31是用来做浮点数运算的寄存器;RISC-V一定有x0-x31寄存器,但是不一定有f0-f31寄存器,这要看支不支持浮点数运算;(3)保存者:调用者保存就是在函数跳

关系型数据库和非关系型数据库

关系型数据库和非关系型数据库关系型数据库非关系型数据库非关系型数据库和关系型数据库是两种不同类型的数据库管理系统,它们用于存储和管理数据,但在数据组织和处理方式上有一些重要的区别。关系型数据库1.结构化数据存储:关系型数据库以表格形式存储数据,数据以行和列的方式组织,每个表都有预定义的模式(也称为模式或架构),这意味着

Hive参数与性能调优-V2.0

Hive作为大数据平台举足轻重的框架,以其稳定性和简单易用性也成为当前构建企业级数据仓库时使用最多的框架之一。但是如果我们只局限于会使用Hive,而不考虑性能问题,就难搭建出一个完美的数仓,所以Hive性能调优是我们大数据从业者必须掌握的技能。本文将给大家讲解Hive性能调优的一些方法及技巧。一、Hive性能调优的方式

论文阅读之Learning and Generalization of Motor Skills by Learning from Demonstration

论文阅读其实就是用自己的话讲一遍,然后理解其中的方法0、论文基本信息为什么阅读此篇论文:因为它是DMP经典论文,被引多次,学史可以明智,了解最初机理。论文题目:LearningandGeneralizationofMotorSkillsbyLearningfromDemonstration会议名称:2009ICRA论文

Zookeeper集群 + Kafka集群

Zookeeper概述Zookeeper定义Zookeeper是一个开源的分布式的,为分布式框架提供协调服务的Apache项目。Zookeeper工作机制Zookeeper从设计模式角度来理解:是一个基于观察者模式设计的分布式服务管理框架,它负责存储和管理大家都关心的数据,然后接受观察者的注册,一旦这些数据的状态发生变

《计算机视觉中的多视图几何》笔记(1)

1Introduction–aTourofMultipleViewGeometry本章介绍了本书的主要思想。1.1Introduction–theubiquitousprojectivegeometry为了了解为什么我们需要射影几何,我们从熟悉的欧几里得几何开始。欧几里得几何在二维中认为平行线是不会相交的,解决这个问题

【Linux网络编程】日志与守护进程

日志是网络服务器程序在后台以守护进程的形式运行时,处理情况的描述被打印到了日志文件里面,方便维护人员查看。1.前台进程与后台进程左边会话输入命令sleep10000&代表进程后台运行,右边会话输入命令sleep20000可以看到命令行解释器直接卡住了。STATS+就是前台进程的意思,STATS就是后台进程。可以看到后台

自动化控制系统的设计重点是什么?

要实现对选择性激光烧结系统预热温度的控制,需要找到合理的控制对象模型,但选择性激光烧结设备的预热温度场是一个复杂的非线性系统,很难找到合理的控制对象模型来实现预热温度场的温度控制。模糊控制不需要具体的控制模型,预热温度场的温度控制只能通过模糊推理来实现。模糊控制技术是现代控制理论中基于语言规则和模糊推理的先进控制策略和

狂神docker

狂神说docker参考文章-----docker概述docker为什么会出现?–环境部署麻烦,两套环境(开发-运维)我的电脑可以运行,到你那就不可用。开发即运维–开发打包部署上线一条龙环境配置十分麻烦,机器部署耗时间(redis,eshadoop费时费力)发布项目时,带上环境—引出docker–开发打包部署上线,一套流

热文推荐