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

news/2025/2/23 16:15:59

文章目录





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




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 的析构函数

在这里插入图片描述

文章来源:https://blog.csdn.net/han1202012/article/details/132990068
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.niftyadmin.cn/n/5034111.html

相关文章

【大模型AIGC系列课程 3-6】ChatGLM2-6B的应用

重磅推荐专栏: 《大模型AIGC》;《课程大纲》 本专栏致力于探索和讨论当今最前沿的技术趋势和应用领域,包括但不限于ChatGPT和Stable Diffusion等。我们将深入研究大型模型的开发和应用,以及与之相关的人工智能生成内容(AIGC)技术。通过深入的技术解析和实践经验分享,旨在…

701. 二叉搜索树中的插入操作

给定二叉搜索树&#xff08;BST&#xff09;的根节点 root 和要插入树中的值 value &#xff0c;将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。 输入数据 保证 &#xff0c;新值和原始二叉搜索树中的任意节点值都不同。 注意&#xff0c;可能存在多种有效的插入方式&am…

线性代数与编程语言结合 基础

什么是线性代数 线性代数是数学的一个分支&#xff0c;研究向量空间和线性变换的理论与方法。它涉及了向量、矩阵、线性方程组、线性映射等概念与运算规则。线性代数在科学和工程领域中被广泛应用&#xff0c;如物理学、计算机图形学、统计学、电子工程等。它提供了一种强大的…

mongodb语法以及springboot中操作mongodb数据库(query update Criteria的使用)

mongodb语法 创建数据库&#xff1a;use DATABASE_NAME 创建集合&#xff1a;db.createCollection("COLLECTION_NAME") 插入数据&#xff1a;db.COLLECTION_NAME.insert({key:value}) 查询数据&#xff1a;db.COLLECTION_NAME.find() 更新数据&#xff1a;db.COL…

司徒理财:9.18国际黄金晚间会持续上涨吗?原油精准操作布局

黄金走势分析&#xff1a;      上周五金价企稳1910关口上方迎来多头强势震荡上行破高收盘&#xff0c;亚欧盘压制于1920下方不断窄幅震荡整理&#xff0c;晚间美盘加速拉升突破并站上1920关口延续走强&#xff0c;最终凌晨加速冲高刺破1930关口回落震荡收盘&#xff0c;整…

QT:使用行编辑器、滑动条、滚动条、进度条、定时器

widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QLineEdit> //行编辑器 #include <QSlider> //滑动条 #include <QScrollBar> //滚动条 #include <QProgressBar> //进度条 #include <QTimer> …

Qt 面试突击

1.在Qt中&#xff0c;多线程环境下&#xff0c;信号槽分别在什么样的线程中执行&#xff0c;如何控制&#xff1f; &#xff08;1&#xff09;信号槽的执行线程 如果信号和槽都在同一个线程&#xff0c;就它们就在这个线程中执行如果信号和槽不在同一个线程&#xff1a; Qt::…

MySQL入门指南:数据库操作的基础知识

当谈到关系型数据库管理系统(RDBMS)时&#xff0c;MySQL无疑是最常见和广泛使用的一个。它是一个强大的工具&#xff0c;用于存储、管理和检索数据。在这篇博客中&#xff0c;我们将介绍MySQL的基本知识&#xff0c;包括数据库的操作、数据表的操作以及数据的增删改查~~ 目录 …