当前位置: 首页 > news >正文

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

文章目录

  • 一、匿名对象 生命周期
    • 1、匿名对象 生命周期 说明
    • 2、代码示例 - 匿名对象 生命周期
  • 二、构造函数 中调用 构造函数
    • 1、构造函数 中 不能调用 构造函数
    • 2、代码示例 - 构造函数中调用构造函数


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

  • 初始化列表 可以 为 类的 成员变量 提供初始值 ;
  • 初始化列表 可以 调用 类的 成员变量 类型的 构造函数 进行成员变量初始化操作 ;
  • 初始化列表 可以 使用 构造函数 中传入的 参数 ;
  • 类初始化时 , 根据定义顺序 , 先调用 成员变量的 构造函数 , 然后调用外部类构造函数 , 析构函数正好相反 ;
  • 实例对象 的 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 . . .

在这里插入图片描述

相关文章:

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

文章目录 一、匿名对象 生命周期1、匿名对象 生命周期 说明2、代码示例 - 匿名对象 生命周期 二、构造函数 中调用 构造函数1、构造函数 中 不能调用 构造函数2、代码示例 - 构造函数中调用构造函数 构造函数初始化列表 总结 : 初始化列表 可以 为 类的 成员变量 提供初始值 ;…...

Knife4j系列--使用方法

原文网址&#xff1a;Knife4j系列--使用/教程/实例/配置_IT利刃出鞘的博客-CSDN博客...

pmp项目管理考试是什么?适合哪些人学?

PMP&#xff0c;简单点说&#xff0c;就是美国PMI为考察项目管理人士的专业能力而设立的考试。 该流程以知识和任务驱动型指南评估从业者的能力&#xff0c;同时确定项目经理能力行业标准&#xff0c;包括各项知识、任务和技能的特点、重要性与运用频率。&#xff08;考纲原文…...

CSDN博客可以添加联系方式了

csdn博客一直不允许留一些联系方式&#xff0c;结果是官方有联系方式路径 在首页&#xff0c;往下拉&#xff0c;左侧就有 点击这个即可添加好友了~ 美滋滋&#xff0c;一起交流&#xff0c; 学习技术 ~...

小程序隐私弹窗的实现

小程序的开发者对于微信官方来说是有爱有恨&#xff0c;三天二头整事是鹅厂的一贯风格。 隐私弹窗的几个要点 回归正题&#xff0c;小程序隐私弹窗的几个要点&#xff1a; 1、何时弹出用户隐私协议的弹窗&#xff1f; 2、是每次进小程序都弹出来吗&#xff1f; 这两个想明…...

【JavaEE】多线程案例-单例模式

文章目录 1. 前言2. 什么是单例模式3. 如何实现单例模式3.1 饿汉模式3.2 懒汉模式4. 解决单例模式中遇到的线程安全问题4.1 加锁4.2 加上一个判断解决频繁加锁问题4.2 解决因指令重排序造成的线程不安全问题 1. 前言 单例模式是我们面试中最常考到的设计模式。什么是设计模式呢…...

社区分享|MeterSphere变身“啄木鸟”,助力云帐房落地接口自动化测试

云帐房网络科技有限公司&#xff08;以下简称为“云帐房”&#xff09;成立于2015年3月&#xff0c;以“成为最值得信赖的税务智能公司”为愿景&#xff0c;运用人工智能、大数据等互联网技术&#xff0c;结合深厚的财税行业服务经验&#xff0c;为代账公司和中大型企业提供智能…...

fpga内嵌逻辑分析仪使用方法

文章目录 前言一、方法1 — 使用 IP 核创建 ILA 调试环境1、创建 ILA ip 核2、进行例化3、生成比特流文件4、下载程序5、进行在线调试 二、方法2 — 使用 Debug 标记创建 ILA1、Debug 标记相关信号2、综合操作3、设置 Set Up Debug4、生成比特文件5、下载程序6、进行在线调试 前…...

第14章 结构和其他数据形式

本章介绍以下内容&#xff1a; 关键字&#xff1a;struct、union、typedef 运算符&#xff1a;.、-> 什么是C结构&#xff0c;如何创建结构模板和结构变量 如何访问结构的成员&#xff0c;如何编写处理结构的函数 联合和指向函数的指针 设计程序时&#xff0c;最重要的步骤之…...

vue 把echarts封装成一个方法 并且从后端读取数据 +转换数据格式 =动态echarts 联动echarts表

1.把echarts 在 methods 封装成一个方法mounted 在中调用 折线图 和柱状图 mounted调用下边两个方法 mounted(){//最早获取DOM元素的生命周期函数 挂载完毕console.log(mounted-id , document.getElementById(charts))this.line()this.pie()},methods里边的方法 line() {// …...

Python基础08 面向对象的基本概念

Python使用类(class)和对象(object)&#xff0c;进行面向对象&#xff08;object-oriented programming&#xff0c;简称OOP&#xff09;的编程。 面向对象的最主要目的是提高程序的重复使用性。我们这么早切入面向对象编程的原因是&#xff0c;Python的整个概念是基于对象的。…...

APP自动化之Poco框架

今天给大家介绍一款自动化测试框架Poco&#xff0c;其脚本写法非常简洁、高效&#xff0c;其元素定位器效率更快&#xff0c;其本质基于python的第三方库&#xff0c;调试起来也会非常方便&#xff0c;能够很好的提升自动化测试效率&#xff0c;节省时间。 (一&#xff09;背景…...

c++拷贝构造【显式调用】和运算符=重载构造【隐式调用】解析

深拷贝 vs. 浅拷贝 深拷贝&#xff1a;开辟新内存&#xff0c;独立对象&#xff0c;堆区浅拷贝&#xff1a;共享内存&#xff0c;引用对象&#xff0c;栈区 深拷贝&#xff1a;深拷贝是一种拷贝方式&#xff0c;它会在堆区重新分配内存并复制对象的内容。 这意味着原对象和新…...

无涯教程-JavaScript - LCM函数

描述 LCM函数返回整数的最小公倍数。最小公倍数是最小的正整数,它是所有整数参数number1,number2等的倍数。使用LCM添加具有不同分母的分数。 语法 LCM (number1, [number2] ...)争论 Argument描述Required/OptionalNumber1, number2... 您想要最小公倍数的1到255个值。 如…...

Java多线程篇(3)——线程池

文章目录 线程池ThreadPoolExecutor源码分析1、如何提交任务2、如何执行任务3、如何停止过期的非核心线程4、如何使用拒绝策略 ScheduledThreadPoolExecutor源码分析 线程池 快速过一遍基础知识 7大参数 corePoolSize &#xff1a; 核心线程数 maximumPoolSize&#xff1a; 最…...

那些年我们遇到过的关于excel的操作

本文为直接从百度上搜索的关于excel的函数使用&#xff0c;方便以后用&#xff0c;希望会持续补充 excel中筛选出两列重复的数据【场景&#xff1a;A、B两列数据个数不同且无序&#xff0c;想找出A列中的数据在B列中不存在的&#xff0c;通过比较后单元格为空的代表该行不存在的…...

Angular变更检测机制

前段时间遇到这样一个 bug&#xff0c;通过一个 click 事件跳转到一个新页面&#xff0c;新页面迟迟不加载&#xff1b; 经过多次测试发现&#xff0c;将鼠标移入某个 tab &#xff0c;页面就加载出来了。 举个例子&#xff0c;页面内容无法加载&#xff0c;但是将鼠标移入下图…...

Redis之String类型

文章目录 Redis之String类型1. 赋值/获取值2. 同时设置/获取多个键值3. 数值增减4. 获取字符串长度5. 向尾部追加值6. 分布式锁7.应用场景 Redis之String类型 Redis命令不区分大小写 1. 赋值/获取值 赋值&#xff1a;set key value 取值&#xff1a;get key (当键不存在时候&…...

使用redis中的zset实现滑动窗口限流

使用redis和zset实现滑动窗口限流 文章目录 使用redis和zset实现滑动窗口限流Zset**初始化一个ZSet**&#xff1a;其中包含所有用户的ID和时间戳。**添加元素到ZSet**&#xff1a;当用户发起请求时&#xff0c;将当前时间戳和用户ID作为元素添加到ZSet中。**删除过期的元素**&a…...

Linux下C语言使用 netlink sockets与内核模块通信

netlink简介 Netlink套接字是用以实现用户进程与内核进程通信的一种特殊的进程间通信(IPC) ,也是网络应用程序与内核通信的最常用的接口。在Linux标准内核中&#xff0c;系统默认集成了很多netlink实例&#xff0c;比如日志上报、路由系统等&#xff0c;netlink消息是双向的&a…...

地震勘探——干扰波识别、井中地震时距曲线特点

目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波&#xff1a;可以用来解决所提出的地质任务的波&#xff1b;干扰波&#xff1a;所有妨碍辨认、追踪有效波的其他波。 地震勘探中&#xff0c;有效波和干扰波是相对的。例如&#xff0c;在反射波…...

Nuxt.js 中的路由配置详解

Nuxt.js 通过其内置的路由系统简化了应用的路由配置&#xff0c;使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...

如何为服务器生成TLS证书

TLS&#xff08;Transport Layer Security&#xff09;证书是确保网络通信安全的重要手段&#xff0c;它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书&#xff0c;可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...

k8s业务程序联调工具-KtConnect

概述 原理 工具作用是建立了一个从本地到集群的单向VPN&#xff0c;根据VPN原理&#xff0c;打通两个内网必然需要借助一个公共中继节点&#xff0c;ktconnect工具巧妙的利用k8s原生的portforward能力&#xff0c;简化了建立连接的过程&#xff0c;apiserver间接起到了中继节…...

【7色560页】职场可视化逻辑图高级数据分析PPT模版

7种色调职场工作汇报PPT&#xff0c;橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版&#xff1a;职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...

Go 并发编程基础:通道(Channel)的使用

在 Go 中&#xff0c;Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式&#xff0c;用于在多个 Goroutine 之间传递数据&#xff0c;从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...

从面试角度回答Android中ContentProvider启动原理

Android中ContentProvider原理的面试角度解析&#xff0c;分为​​已启动​​和​​未启动​​两种场景&#xff1a; 一、ContentProvider已启动的情况 1. ​​核心流程​​ ​​触发条件​​&#xff1a;当其他组件&#xff08;如Activity、Service&#xff09;通过ContentR…...

[特殊字符] 手撸 Redis 互斥锁那些坑

&#x1f4d6; 手撸 Redis 互斥锁那些坑 最近搞业务遇到高并发下同一个 key 的互斥操作&#xff0c;想实现分布式环境下的互斥锁。于是私下顺手手撸了个基于 Redis 的简单互斥锁&#xff0c;也顺便跟 Redisson 的 RLock 机制对比了下&#xff0c;记录一波&#xff0c;别踩我踩过…...

Mysql故障排插与环境优化

前置知识点 最上层是一些客户端和连接服务&#xff0c;包含本 sock 通信和大多数jiyukehuduan/服务端工具实现的TCP/IP通信。主要完成一些简介处理、授权认证、及相关的安全方案等。在该层上引入了线程池的概念&#xff0c;为通过安全认证接入的客户端提供线程。同样在该层上可…...

高效的后台管理系统——可进行二次开发

随着互联网技术的迅猛发展&#xff0c;企业的数字化管理变得愈加重要。后台管理系统作为数据存储与业务管理的核心&#xff0c;成为了现代企业不可或缺的一部分。今天我们要介绍的是一款名为 若依后台管理框架 的系统&#xff0c;它不仅支持跨平台应用&#xff0c;还能提供丰富…...