【C++】构造函数初始化列表 ⑤ ( 匿名对象 生命周期 | 构造函数 中 不能调用 构造函数 )

news/2024/5/19 0:43:21 标签: c++, 匿名对象, 构造函数, 初始化列表

文章目录


构造函数初始化列表 总结 :





一、匿名对象 生命周期




1、匿名对象 生命周期 说明


调用 类名(构造函数参数) 创建的是 匿名对象 ;

匿名对象 的 生命周期 仅限于 该 匿名对象 所在的 代码表达式 ,

一旦 该行代码执行完毕 , 匿名对象就会被销毁 ;


匿名对象 的 生命周期 仅限于 那一行代码 中 ;


匿名对象 生命周期 分以下几种情况 :


2、代码示例 - 匿名对象 生命周期


下面的代码中 , 在 fun 函数中 , 调用 Student(18, 180) 代码 , 创建 Student 类型的匿名对象 , 匿名对象的生命周期 只存在于 这一行代码 , 该行代码执行完毕后 , 匿名对象 就会被 析构 ;

void fun()
{
	cout << "创建匿名对象之前" << endl;
	// 创建 Student 类型的匿名对象
	// 匿名对象的生命周期 只存在于 这一句话
	Student(18, 180);
	cout << "创建匿名对象之后" << endl;
}

代码示例 :

#include "iostream"
using namespace std;

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

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

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

void fun()
{
	cout << "创建匿名对象之前" << endl;
	// 创建 Student 类型的匿名对象
	// 匿名对象的生命周期 只存在于 这一句话
	Student(18, 180);
	cout << "创建匿名对象之后" << endl;
}


int main()
{
	// 该函数中定义了一个匿名对象
	fun();


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

执行结果 :

创建匿名对象之前
执行 Student 的构造函数
执行 Student 的析构函数
创建匿名对象之后
Press any key to continue . . .

在这里插入图片描述





二、构造函数 中调用 构造函数




1、构造函数 中 不能调用 构造函数


构造函数中 调用 构造函数 是危险行为 ;

构造函数 中调用 构造函数 , 并不会为本对象进行初始化操作 ;

构造函数 的调用方式 , 天然就会创建一个 匿名对象 ,

如果 没有变量 接收 这个 匿名对象 , 该匿名对象 在 本行表达式执行完毕后 , 就会被销毁 ;



2、代码示例 - 构造函数中调用构造函数


下面的代码中 ,

先定义 有参构造函数 ,

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

然后 , 在无参的 构造函数中 , 调用 有参构造函数 ;

	// 构造函数中 调用 构造函数 是危险行为
	Student()
	{
		// 构造函数中调用构造函数
		// 此时 创建 的是匿名对象
		// 如果 匿名对象 没有被接收 
		// 就会在 本代码 执行结束后 立刻销毁
		Student(18, 180);
	}

Student(18, 180) 调用方式 , 会创建一个 匿名对象 ;

如果 匿名对象 没有被接收 , 就会在 本代码 执行结束后 立刻销毁 ;

本实例对象 的成员变量实际上没有进行初始化 , 当前为随机值 ;

这也是 打印 对象成员变量 的值为随机值 的原因 ;

s.m_age = -858993460 , s.m_height = -858993460

代码示例 :

#include "iostream"
using namespace std;

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

	// 构造函数中 调用 构造函数 是危险行为
	Student()
	{
		// 构造函数中调用构造函数
		// 此时 创建 的是匿名对象
		// 如果 匿名对象 没有被接收 
		// 就会 本代码 执行结束后 立刻销毁
		Student(18, 180);
	}

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

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

void fun()
{
	// 创建 Student 类型的匿名对象
	// 匿名对象的生命周期 只存在于 这一句话
	Student(18, 180);
}


int main()
{
	// 该函数中定义了一个匿名对象
	//fun();

	Student s;
	cout << "s.m_age = " << s.m_age << " , s.m_height = " << s.m_height << endl;


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

执行结果 :

执行 Student 的构造函数
执行 Student 的析构函数
s.m_age = -858993460 , s.m_height = -858993460
Press any key to continue . . .

在这里插入图片描述


http://www.niftyadmin.cn/n/5035671.html

相关文章

数据治理-大数据与数据科学-定义大数据战略与业务需求

组织试图解决什么问题&#xff0c;需要分析什么 虽然数据科学的优点是它可以为组织提供一个新的视角&#xff0c;但该组织仍然需要一个起点。一个组织可以决定如何使用这些数据来理解业务或业务环境&#xff0c;证明关于新产品价值的想法&#xff0c;探索未知的事物&#xff0c…

如何去掉word上方页眉处的横线

一、问题描述 有时候word总会莫名其妙在页眉处出现一条横线&#xff0c;如图&#xff1a; 二、解决步骤 1.首先点击任一页眉进入页眉编辑状态&#xff0c;然后点击设计&#xff1a; 2.选择页面边框&#xff1a; 3.选择边框——选择无——选择应用于段落——完成。

用HTML+JS制作二维码生成器

代码如下 <!DOCTYPE html> <html> <head> <meta name"viewport" content"widthdevice-width, initial-scale1.0"> <title>二维码生成</title> <style> body { font-family: Arial, sans-serif; …

【学习笔记】各类基于决策单调性的dp优化

文章目录 对于决策单调性的一般解释关于决策单调性的证明四边形不等式一维dp区间dp一种二维dp一些满足四边形不等式的函数类 与图形相结合 决策单调性的常见优化手段二分队列二分栈分治类莫队做法 SMAWKWQS二分WQS多解情况满足四边形不等式的序列划分问题的答案凸性以及WQS二分…

Go expvar包

介绍与使用 expvar 是 exposed variable的简写 expvar包[1]是 Golang 官方为暴露Go应用内部指标数据所提供的标准对外接口&#xff0c;可以辅助获取和调试全局变量。 其通过init函数将内置的expvarHandler(一个标准http HandlerFunc)注册到http包ListenAndServe创建的默认Serve…

*p 和p区别

*p 和 &p 是在C语言中用于处理指针的两种不同操作。 *p: * 是解引用运算符&#xff0c;用于访问指针所指向的内存地址上的值。如果 p 是一个指针变量&#xff0c;*p 就是该指针所指向的值。举例&#xff1a;如果有 int *p&#xff0c;它是一个指向整数的指针&#xff0c;那…

树形DP杂题

引 对老师布置的题目稍微记录一下吧 也算对树形 D P DP DP 的巩固 T1 Ostap and Tree 题目传送门 由于有 距离 k 距离k 距离k 的限制&#xff0c;设计二维 d p dp dp 设计状态&#xff1a; f i , j : i 的子树内&#xff0c;离 i 最近的染色点与 i 距离为 j 且若 j <…

Miniconda简单操作说明

编辑系统变量 Miniconda Miniconda\Scripts 到Path启用用户自定义脚本 Set-ExecutionPolicy -ExecutionPolicy RemoteSigned 右键点击屏幕开始键&#xff0c;以管理员权限运行powershell输入上述命令后按y同意。重启电脑后&#xff0c;即可在控制台输入conda来执行conda命令。 …