【C++】构造函数初始化列表 ② ( 构造函数 为 初始化列表 传递参数 | 类嵌套情况下 的 构造函数 / 析构函数 执行顺序 )
  K1I6GvxBEuyy 2023年11月02日 94 0



文章目录

  • 一、构造函数 为 初始化列表 传递参数
  • 1、构造函数参数传递
  • 2、代码示例 - 构造函数参数传递
  • 二、类嵌套情况下 的 构造函数 / 析构函数 执行顺序
  • 1、构造函数 / 析构函数 执行顺序
  • 2、代码示例 - 构造函数执行顺序







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




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

执行结果 :

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






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




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

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


【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
K1I6GvxBEuyy
作者其他文章 更多