【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.xdnf.cn/news/1556509.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Oracle登录报错-ORA-01017: invalid username/password;logon denied

接上文&#xff1a;Oracle创建用户报错-ORA-65096: invalid common user or role name 我以为 按照上文在PDB里创建了用户&#xff0c;我以为就可以用PLSQL远程连接了&#xff0c;远程服务器上也安装了对应版本的Oracle客户端&#xff0c;但是我想多了&#xff0c;客户只是新建…

使用Python查找WeChat和QQ的安装路径和文档路径

在日常工作和生活中&#xff0c;我们经常需要查找某些应用程序的安装位置或者它们存储文件的位置。特别是对于像WeChat&#xff08;微信&#xff09;和QQ这样的即时通讯软件&#xff0c;了解它们的文件存储位置可以帮助我们更好地管理我们的聊天记录和共享文件。今天&#xff0…

【Diffusion分割】Cold SegDiffusion:医学图像分割的扩散模型

Cold SegDiffusion: A novel diffusion model for medical image segmentation 摘要&#xff1a; 随着深度学习的发展&#xff0c;扩散模型在医学图像分割任务中表现出了卓越的性能。然而&#xff0c;传统的分割扩散模型通常采用随机高斯噪声生成分割掩膜&#xff0c;导致分割…

Java建筑行业智能化管理系统源码,PC端、手机端、大屏端源码,智慧工地管理平台源码,智慧建设平台 智慧住建平台

智慧工地平台全套源码合作 智慧工地是指运用现代信息技术&#xff0c;如物联网&#xff08;IoT&#xff09;、大数据、人工智能&#xff08;AI&#xff09;、云计算、移动互联网等&#xff0c;对传统建筑工地进行智能化改造和管理的新型工地。它通过高度集成的系统和设备&#…

NIO实现聊天室之:一切都要从网络编程的基础开始聊起!

一、写在开头 大家好,Build哥回来啦!停更了大概2个月之久,之前有段时间去写小说去了,后来又因为公司活太多,牛马干的太投入,就拉下了博客的更新,国庆节期间,难得的闲下来,准备回归老本行啦。 大致的翻看了一下之前更新的内容,已经写到了Java的IO部分,作为网络传输…

eNodeB User Manual-Introduction

eNodeB architecture ### 概述 srsENB是一个完全由软件实现的LTE eNodeB基站。它作为一个应用程序运行在标准的基于Linux的操作系统上&#xff0c;能够连接到任何LTE核心网络&#xff08;EPC&#xff09;并创建一个本地LTE小区。为了通过空气传输和接收无线电信号&#xff0c;…

深入浅出解析大模型:探索智能体(Agent)

大语言模型 vs 人类 大语言模型很强大&#xff0c;就像人类的大脑一样拥有思考的能力。如果人类只有大脑&#xff0c;没有四肢&#xff0c;没有工具&#xff0c;是没办法与世界互动的。如果我们能给大模型配备上四肢和工具呢&#xff1f;大模型是不是就会打破次元壁&#xff0…

探索Python文本处理的新境界:textwrap库揭秘

文章目录 **探索Python文本处理的新境界&#xff1a;textwrap库揭秘**一、背景介绍二、textwrap库是什么&#xff1f;三、如何安装textwrap库&#xff1f;四、简单函数使用方法4.1 wrap()4.2 fill()4.3 shorten()4.4 dedent()4.5 indent() 五、实际应用场景5.1 格式化日志输出5…

华为OD机试 - 冠亚军排名(Python/JS/C/C++ 2024 E卷 100分)

华为OD机试 2024E卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试真题&#xff08;Python/JS/C/C&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;私信哪吒&#xff0c;备注华为OD&#xff0c;加入华为OD刷题交流群&#xff0c;…

网页也能跑大模型?看这一篇就够了

写在最前 本故事主要介绍在网页上部署模型的来龙去脉&#xff0c;你想问的问题&#xff0c;可能都可以在这里找到答案 在这个 AI 内容生成泛滥的时代&#xff0c;依然有一批人"傻傻"坚持原创&#xff0c;如果您能读到最后&#xff0c;还请点赞或收藏或关注支持下我呗…

ChatGPT写论文全流程揭秘:从构思到成稿!

撰写高质量的学术论文是一项复杂且耗时的任务&#xff0c;涵盖从构思到研究、撰写及最终修改的每一个步骤&#xff0c;每一步都需要大量的时间和精力。然而&#xff0c;借助ChatGPT这样的工具&#xff0c;可以有效辅助论文写作的各个阶段&#xff0c;从而提升效率和确保论文的学…

在不支持WSL2的Windows环境下安装Redis并添加环境变量的方法

如果系统版本支持 WSL 2 可跳过本教程。使用官网提供的教程即可 官网教程 查看是否支持 WSL 2 如果不支持或者觉得麻烦可以按照下面的方式安装 下载 点击打开下载地址 下载 zip 文件即可 安装 将下载的 zip 文件解压到自己想要解压的地方即可。&#xff08;注意&#x…

E37.【C语言】动态内存管理练习题

1. 求下列代码的执行结果 #include <stdio.h> char* GetMemory(void) {char p[] "hello world";return p; }void Test(void) {char* str NULL;str GetMemory();printf(str); }int main() {Test();return 0; } 答案速查 乱码 分别是x86debug和x64debug下…

业务封装与映射 -- OTUk/ODUk/OPUk比特速率和容量

介绍OTUk&#xff0c;ODUk&#xff0c;OPUk&#xff0c;OTUCn&#xff0c;ODUCn&#xff0c;OPUCn的比特速率和容量。 OTN支持超100 Gbit/s&#xff0c;100 Gbit/s&#xff0c;40 Gbit/s&#xff0c;10 Gbit/s&#xff0c;2.5 Gbit/s&#xff0c;1.25 Gbit/s等多种线路速率。 …

大模型应用新领域:探寻终端侧 AI 竞争核心|智于终端

2024年过去2/3&#xff0c;大模型领域的一个共识开始愈加清晰&#xff1a; AI技术的真正价值在于其普惠性。没有应用&#xff0c;基础模型将无法发挥其价值。 于是乎&#xff0c;回顾这大半年&#xff0c;从互联网大厂到手机厂商&#xff0c;各路人马都在探索AI时代Killer AP…

二叉树的进阶

前言&#xff1a; 关于二叉树的基础知识&#xff0c;小生这里就不在一一一赘述了&#xff0c;对前面二叉树的基础知识有遗忘的铁子 们&#xff0c;可以康康前期咱的博客。 链接在此&#xff1a; 数据结构之二叉树 的精讲 目录&#xff1a; 一&#xff1a;二叉搜索树的定义…

从0开始linux(6)——gcc

欢迎来到博主的专栏&#xff1a;从0开始linux 博主ID&#xff1a;代码小豪、 文章目录 gccgcc的文件风格预处理编译汇编链接 gcc gcc是linux系统下常用的C语言编译器&#xff0c;随着后续的扩展&#xff0c;gcc支持了c&#xff0c;并推出了g编译器&#xff0c;现在的gcc可以支…

基于ssm疫情防控志愿者管理系统设计与实现

博主介绍&#xff1a;专注于Java&#xff08;springboot ssm springcloud等开发框架&#xff09; vue .net php phython node.js uniapp小程序 等诸多技术领域和毕业项目实战、企业信息化系统建设&#xff0c;从业十五余年开发设计教学工作 ☆☆☆ 精彩专栏推荐订阅☆☆☆…

轻松部署大模型:Titan Takeoff入门指南

轻松部署大模型&#xff1a;Titan Takeoff入门指南 在人工智能的快速发展中&#xff0c;处理自然语言处理&#xff08;NLP&#xff09;任务的大规模语言模型&#xff08;LLM&#xff09;至关重要。然而&#xff0c;部署这些模型往往具有挑战性&#xff0c;需要高性能的硬件和优…

论文(一)——寻找顶刊顶会

文章目录 一、顶刊二、顶会三、问题3.1 顶刊和顶会有什么区别3.1.1 定义3.1.2 评审流程3.1.3. 发表周期3.1.4 影响力与权威性3.1.5 适用领域3.1.6 交流与讨论 3.2 如何读论文 3.3 IEEE是啥&#xff1f;为什么这么多四、最后参考文章 一、顶刊 &#xff08;1&#xff09; IEEE …