当前位置: 首页 > 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 . . .

在这里插入图片描述

http://www.lryc.cn/news/170441.html

相关文章:

  • Knife4j系列--使用方法
  • pmp项目管理考试是什么?适合哪些人学?
  • CSDN博客可以添加联系方式了
  • 小程序隐私弹窗的实现
  • 【JavaEE】多线程案例-单例模式
  • 社区分享|MeterSphere变身“啄木鸟”,助力云帐房落地接口自动化测试
  • fpga内嵌逻辑分析仪使用方法
  • 第14章 结构和其他数据形式
  • vue 把echarts封装成一个方法 并且从后端读取数据 +转换数据格式 =动态echarts 联动echarts表
  • Python基础08 面向对象的基本概念
  • APP自动化之Poco框架
  • c++拷贝构造【显式调用】和运算符=重载构造【隐式调用】解析
  • 无涯教程-JavaScript - LCM函数
  • Java多线程篇(3)——线程池
  • 那些年我们遇到过的关于excel的操作
  • Angular变更检测机制
  • Redis之String类型
  • 使用redis中的zset实现滑动窗口限流
  • Linux下C语言使用 netlink sockets与内核模块通信
  • excel中的引用与查找函数篇3
  • 【Linux学习笔记】 - 常用指令学习及其验证(下)
  • 面试官:请说说flex布局_番茄出品.md
  • ChatGLM DeepSpeed/P-Tuning v2 调参
  • Leetcode每日一题:打家劫舍系列Ⅰ、Ⅱ、Ⅲ、Ⅳ(2023.9.16~2023.9.19 C++)
  • 容易对一个异性产生依赖感怎么办?
  • Windows10/11无线网卡WIFI驱动详细下载安装教程
  • 面向面试知识--Lottery项目
  • SpringBoot接口中如何直接返回图片数据
  • c语言进阶部分详解(指针进阶1)
  • 计算机竞赛 大数据商城人流数据分析与可视化 - python 大数据分析