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

2023-09-19 22:15:00


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

  • 初始化列表 可以 为 类的 成员变量 提供初始值 ;
  • 初始化列表 可以 调用 类的 成员变量 类型的 构造函数 进行成员变量初始化操作 ;
  • 初始化列表 可以 使用 构造函数 中传入的 参数 ;
  • 类初始化时 , 根据定义顺序 , 先调用 成员变量的 构造函数 , 然后调用外部类构造函数 , 析构函数正好相反 ;
  • 实例对象 的 const 成员变量 必须只能在 初始化列表 中进行 初始化 , 所有的构造函数都要进行初始化操作 ;
  • 构造函数 中 不能调用 构造函数 ;




一、匿名对象 生命周期




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 . . .

在这里插入图片描述

更多推荐

【全面】CSS3新增了哪些新特性?

目录一、选择器的扩展1.属性选择器2.伪类选择器3.伪元素选择器二、盒子模型的增强1.box-sizing属性2.边框圆角(border-radius)3.盒阴影(box-shadow)三、过渡和动画效果1.过渡效果2.动画效果四、响应式布局1.媒体查询(mediaquery)2.弹性布局(Flexbox)CSS3是C

IDEA——工程项目的两种窗口开发模式

文章目录引言一、多项目窗口模式的便利1.1源码debug二、多项目窗口模式的弊端三、多项目窗口的版本管理四、单项目、多项目窗口模式转换引言idea编辑器有两种窗口模式,一种是单项目窗口,另一种是多项目窗口。我个人使用较多的是单项目窗口,即一个微服务项目,或单体项目一个独立的idea窗口。此模式好处有两方面,一是开发者可

基于Java+vue前后端分离安全教育平台设计实现(源码+lw+部署文档+讲解等)

博主介绍:✌全网粉丝30W+,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌🍅文末获取源码联系🍅👇🏻精彩专栏推荐订阅👇🏻不然下次找不到哟2022-2024年最全的计算机软件毕业设计选题

卷运维不如卷网络安全

最近发现很多从事运维的选择了辞职,重新规划自己的职业发展方向。运维工程师这个岗位在IT行业里面确实是处于最底层的,不管什么环节出现问题,基本都是运维背锅。背锅也就罢了,薪资水平也比不上别的岗位。一般运维的薪资水平大多数都是6-9K,还要高频出差。规模小一点的公司省内出差,规模稍微大一点的公司基本全国各地到处飞,而且一呆

《人件》读书笔记

作者与书籍简介:《人件》1987年第一次出版,这本书与《人月神话》共同被誉为软件管理图书的“双子星”。作者TomDeMarco与TimothyLister均为美国咨询师。《人件》是两位作者在越洋航班中的思想碰撞中产生的,“软件系统的主要问题不在技术,而在于社会性因素”这一想法一经产生,作者就展开了一系列的案例研究,一步

QT chart图表(温度曲线实战)

文章目录前言一、QChart介绍二、帮助文档三、QGraphicsView四、QChart的显示总结前言本篇文章开始将带大家学习QTchart图表,后面我们将完成一个小项目,动态温度曲线,并且将本项目移植到ARM开发板上使用DHT11实时检测温度湿度。一、QChart介绍QT的QChart是一个用于绘制各种类型图表的Q

备战2024秋招面试题-负载均衡常见的算法

前言:\textcolor{Green}{前言:}前言:💞快秋招了,那么这个专栏就专门来记录一下,同时呢整理一下常见面试题💞部分题目来自自己的面试题,部分题目来自网络整理给我冲学习目标:面试题:算法题:完成?学习目标:负载均衡常见的算法算法题:组合总和面试题:负载均衡常见的算法负载均衡指的是将用户请求分摊到不同的服

设计模式:迭代器模式

目录组件代码示例源码中使用优劣点总结迭代器模式(IteratorPattern)是一种行为型设计模式,它提供了一种访问聚合对象中各个元素的方法,而无需暴露聚合对象的内部表示。迭代器模式将遍历和操作聚合对象的责任分离,使得遍历算法可以独立于聚合对象变化而变化。在迭代器模式中,聚合对象包含一个迭代器接口,定义了访问和遍历元

python从入门到精通(一)

自己也有三四年的码龄了,目前,重拾起自己的博客,记录自己的学习笔记,为大家提供优质内容,也来巩固自己的学习内容。很开心也成功成为了一名研究生,张张的研究方向是图像处理和计算机视觉这一块,有这方面的小伙伴可以一起探讨学习。接下来先把python学扎实,gogogo!!!以下内容来自于黑马程序员的视频,作者只是做了一下视频

Github上1.1KFork的C++笔记

编程语言(C/C++)原文链接,如果觉得本文对你有所帮助,欢迎去原地址点个Star⭐。侵删https://github.com/linw7/Skill-Tre目录Chapter1Chapter2Chapter3Chapter4编程基础面向对象基础标准模板库编译及调试内容Chapter1:编程基础C/C++的内容又多又杂

结构型设计模式

结构型设计模式结构型设计模式主要总结了一些类或对象组合在一起的经典结构,这些经典的结构可以解决特定应用场景的问题。结构模式包括:代理模式、桥接模式、装饰器模式、适配器模式、门面模式、组合模式、亨元模式。1.代理模式实现方式:代理模式在不改变原始类接口的条件下,为原始类定义一个代理类,主要目的是为了控制访问,而非加强功能

热文推荐