【C++】认识匿名对象

文章目录

目录

  • 文章目录
  • 前言
  • 一、对匿名对象的解读
  • 二、匿名对象的对象类型
  • 三、匿名对象的使用
  • 总结

前言

在C++中,匿名对象是指在没有呗命名的情况下创建的临时对象。它们通常在单个语句中执行一系列操作或调用某个函数,并且不需要将结果存放进变量中。

匿名对象的创建非常简单,在类名后加一对括号,匿名对象就诞生了


一、对匿名对象的解读

匿名对象的结构:

类名();

class A
{
public:A(int a = 0):_a(a){cout << "A()" << endl;}~A(){cout << "~A()" << endl;}
private:int _a;
};int main()
{A a; //有名对象A(10); //匿名对象A b(10);//有名对象return 0;
}

测试运行:

可以看到刚创建的匿名对象,立刻就调用析构函数给释放了

对于有名对象而言,生命周期在函数局部域中

对于匿名对象而言,生命周期就在当行,过了当行它就会调用析构函数,结束它的生命

二、匿名对象的对象类型

匿名对象不仅可以是类类型,也可以是内置类型,例:int,double等

例:

int main()
{cout << int() << endl;    // 0cout << double() << endl; // 0return 0;
}

这里注意本来C++语法规定,内置类型是没有构造函数的,但是有了模板之后,系统对这里进行了特殊处理,内置类型也有了构造函数,这样使得内置类型也有匿名对象了

从这里可以知道,内置类型的匿名对象不给值初始化都是0

接下来我们来看看类类型和内置类型的混合使用

我们在来看一下

模板参数通过模板匿名对象赋予缺省值

Print<int>(10); // 十个0

Print<double>(10); //空

三、匿名对象的使用

简单使用场景:

class A
{
public:int testA(size_t n){cout << "testA" << endl;return n;}
};int main()
{//正常调用A a;a.testA(10);//匿名对象调用A().testA(1);return 0;
}

如果你只需要调用一次函数那么显然使用匿名对象去调用是便利一些的,但是你还想多次调用类中的对象,这里应该使用有名对象

复杂使用场景:

A& ret = A(10);

直接这样写编译器会报错,因为匿名对象的生命周期只在这一行,因为匿名对象和临时对象一样具有常性,所以这里涉及到权限放大的问题

解决方法:在这条语句前面加上const

const A& ret = A(10);

现在这条语句就属于权限的平移,我们知道只要涉及引用,就需要注意权限放大,缩小,平移的问题,权限可以平移和缩小,但是不能放大,所以这条语句是成立的

好了,这个问题解决了,那么如我们上面所说,匿名对象的生命周期只在当行,此时ret是否会指向一块被释放的空间变成野引用呢!

我们来测试一下

可以看到匿名对象并没有立马调用析构函数进行释放

这里其实就是加上了const修饰的原因,使得匿名对象延长了生命周期,只有当ret使用结束之后,即程序结束之后,它才会销毁

匿名函数对于string类的使用:

void push_back(const string& s)
{cout << s << endl;
}
//1
string s1("nxbw");
push_back(s1);
//2
push_back(string("nxbw"));
//3
push_back("nxbw");

第一种是:实例化一个对象,然后使用对象作为参数进行调用

第二种是:使用匿名对象直接进行调用

第三种是:字符串类型隐式类型转换为string类型,进行调用

给push_back的参数加上const,此时即可以接收普通变量也可以接收常引用,提高了代码的健壮性


总结

1.匿名对象生命周期只在当行,过了当行就会调用析构函数析构,所以无法持续使用

2.匿名对象可以是自定义类型也可以是内置类型

3.匿名对象也有自己的构造函数,析构函数和成员函数它们的行为和有名对象一样,但是匿名对象没有名称,所以无法直接访问它们

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/881357.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

每日OJ题_牛客_AB13【模板】拓扑排序_C++_Java

目录 牛客_AB13【模板】拓扑排序 题目解析 C代码 Java代码 牛客_AB13【模板】拓扑排序 【模板】拓扑排序_牛客题霸_牛客网 (nowcoder.com) 描述&#xff1a; 给定一个包含nn个点mm条边的有向无环图&#xff0c;求出该图的拓扑序。若图的拓扑序不唯一&#xff0c;输出任意合法…

Matlab|基于遗传粒子群算法的无人机路径规划【遗传算法|基本粒子群|遗传粒子群三种方法对比】

目录 主要内容 模型研究 部分代码 结果一览 下载链接 主要内容 为了更高效地完成复杂未知环境下的无人机快速探索任务&#xff0c;很多智能算法被应用于无人机路径规划方面的研究&#xff0c;但是传统粒子群算法存在粒子更新思路单一、随机性受限、收敛速度慢…

【笔记】DDD领域驱动设计

同名读书笔记&#xff0c;对于一些自觉重要的点进行记录。 扩展资源&#xff1a;github.com/evancyz/ddd-learning UML中类图的一些基本知识 - jack_Meng - 博客园 最后的第四部分暂时没看 Part Two 模型驱动设计的构造块 Chapter 5 软件中所表示的模型 5.2 模式&#xff1a;…

学习日志35

拆卸线问题&#xff08;Disassembly Line Balancing Problem, DLBP&#xff09;是生产工程和运筹学中的一个特殊问题&#xff0c;它涉及到将废弃产品有效地拆解成可回收利用的部件和材料。随着环保意识的增强和资源回收技术的发展&#xff0c;DLBP逐渐成为研究的热点。这类问题…

MySQL中的嵌套查询

1. 嵌套查询的定义 嵌套查询指在一个查询语句的某个部分嵌入一个子查询。 嵌套查询的执行过程遵循“先子查询、后外层查询”的逻辑。首先&#xff0c;子查询执行并返回一个结果集&#xff0c;可能是一个值、一行或多行数据。接着&#xff0c;外层查询使用子查询的结果继续对数…

FireRedTTS - 小红书最新开源AI语音克隆合成系统 免训练一键音频克隆 本地一键整合包下载

小红书技术团队FireRed最近推出了一款名为FireRedTTS的先进语音合成系统&#xff0c;该系统能够基于少量参考音频快速模仿任意音色和说话风格&#xff0c;实现独特的音频内容创造。 FireRedTTS 只需要给定文本和几秒钟参考音频&#xff0c;无需训练&#xff0c;就可模仿任意音色…

【leetcode】 45.跳跃游戏 ||

如果我们「贪心」地进行正向查找&#xff0c;每次找到可到达的最远位置&#xff0c;就可以在线性时间内得到最少的跳跃次数。 例如&#xff0c;对于数组 [2,3,1,2,4,2,3]&#xff0c;初始位置是下标 0&#xff0c;从下标 0 出发&#xff0c;最远可到达下标 2。下标 0 可到达的…

如何在IDEA使用git上传代码的时候过滤掉非.java文件

1.情况分析 我们的java上传代码的时候&#xff0c;经常会出现这个xml,等等的无关文件&#xff0c;但是这个时候我们使用这个里面的git上传的时候无法过滤掉&#xff0c;我们在自己的这个代码仓库查看的时候经常显示无关文件&#xff0c;这个时候我们就可以通过相关配置进行文件…

MySQL连接查询:联合查询

先看我的表结构 emp表 联合查询的关键字&#xff08;union all, union&#xff09; 联合查询 基本语法 select 字段列表 表A union all select 字段列表 表B 例子&#xff1a;将薪资低于5000的员工&#xff0c; 和 年龄大于50 岁的员工全部查询出来 第一种 select * fr…

【PostgreSQL】运维篇—— 实战案例分析:从需求到实现

假设有一个电子商务平台&#xff0c;需要管理产品、订单和客户信息&#xff0c;如何设计数据库架构以满足业务需求&#xff0c;并实现相关的功能。 一、需求分析 1. 业务背景 某电子商务平台需要一个数据库来存储和管理以下信息&#xff1a; 产品信息&#xff1a;包括产品名…

Java版本的SSE服务端实现样例

简单记录一下使用netty方式实现SSE的服务端功能 目录 简要说明基于Netty功能需求后端代码1. 创建一个SpringBoot 应用2. 创建服务端功能3. 创建前端功能4. 测试SSE 封装为组件 简要说明 Server-Sent Events (SSE) 是一种用于在客户端和服务器之间建立单向通信的技术。 它允许服…

通信工程学习:什么是RFID射频识别

RFID&#xff1a;射频识别 RFID射频识别&#xff08;Radio Frequency Identification&#xff09;&#xff0c;又称为无线射频识别&#xff0c;是一种非接触式的自动识别技术。它通过无线电信号来识别特定目标并读写相关数据&#xff0c;而无需在识别系统与特定目标之间建立机械…

在安卓中使用 `mobile-ffmpeg` 压缩后的视频,浏览器在线播放提示“没有找到支持的视频格式和 MIME 类型”的解决方案

在安卓中使用 mobile-ffmpeg 压缩后的视频&#xff0c;浏览器在线播放提示“没有找到支持的视频格式和 MIME 类型”的解决方案 你可能在安卓开发中使用了 mobile-ffmpeg 进行视频压缩&#xff0c;而当你尝试在浏览器中在线播放压缩后的视频时&#xff0c;看到提示&#xff1a;…

任务【浦语提示词工程实践】

0.1 环境配置 首先点击左上角图标&#xff0c;打开Terminal&#xff0c;运行如下脚本创建虚拟环境&#xff1a; # 创建虚拟环境 conda create -n langgpt python3.10 -y 运行下面的命令&#xff0c;激活虚拟环境&#xff1a; conda activate langgpt 之后的操作都要在这个环境…

socket和http区别

socket和http区别&#xff1a;1、主体不同&#xff1b;2、所处层次不同&#xff1b;3、连接状态不同&#xff1b;4、传输数据量不同&#xff1b;5、数据安全性不同&#xff1b;6、连接方式不同。其中&#xff0c;主体不同指的是socke是一个调用接口&#xff08;API&#xff09;…

TypeScript 中函数的理解及其与 JavaScript 函数的差异

文章目录 一、函数概述二、TypeScript 函数的使用函数类型的声明可选参数剩余参数函数重载 三、TypeScript 与 JavaScript 函数的差异 一、函数概述 在 JavaScript 应用程序中&#xff0c;函数是核心组成部分&#xff0c;它们帮助我们实现代码的抽象、模拟类、隐藏信息和模块化…

【EXCEL数据处理】000013 案例 EXCEL筛选与高级筛选。

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 【EXCEL数据处理】000013 案例 EXCEL筛选与高级筛选。使用的软件&#…

【华为OD机试真题】95、最少面试官数

package mainimport ("fmt""sort" )type s struct {start intend intworkCount int }type duration struct {start intend int }// 查询时间段内是否有可用的面试官 func getFreeS(sList []*s, d *duration, workCountLimit int) (sIndex int)…

C0005.Clion中移动ui文件到新目录后,报错问题的解决

报错问题如下 AutoUic error ------------- "SRC:/confirmwizardpage.cpp" includes the uic file "ui_confirmwizardpage.h", but the user interface file "confirmwizardpage.ui" could not be found in the following directories"SRC…

Redis面试篇2

1、Redis缓存刷新策略有哪些&#xff1f; Redis提供了以下几种缓存刷新策略 基于过期时间&#xff1a;可以设置key的过期时间&#xff0c;当过期时间到达后&#xff0c;Redis会自动删除该key。基于LRU算法&#xff1a;Redis使用LRU算法来淘汰最近最少使用的key&#xff0c;以保…