【C++】匿名对象超详细详解(什么是匿名对象?对象可以是哪些类型呢?)

目录

一、前言

 二、匿名对象的概念详解

🥝 语法结构

🍍概念理解 

三、匿名对象的对象类型

 四、匿名对象的使用

🍇简单场景的使用 

 🍉复杂场景的使用

五、总结

六、共勉


一、前言

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

      匿名对象的创建非常简单,只需在类名后面使用一对空括号。接下去呢我们来谈一谈C++中的匿名对象,可能你在C语言结构体章节中听说过【匿名结构体】,但是【匿名对象】你有听说过吗?

 二、匿名对象的概念详解

🥝 语法结构

 【语法格式】类名()

🍍概念理解 

class A {
public:
	A(int a)
	{
		cout << "A构造函数的调用" << endl;
		_a = a;
	}

	~A()
	{
		cout << "A析构函数的调用" << endl;
	}
private:
	int _a;
};
  • 首先看到这里有一个类A,然后在下面实例化了两个类A的对象,分别使用的是【有名对象】【匿名对象】,此时就可以很明显地看出它们的区别之所在,匿名对象很明显就是没有名字
int main(void)
{
	A a1(10);	// 有名对象 -- 生命周期在当前函数局部域
	A(20);		// 匿名对象 -- 生命周期在当前行
	return 0;
}

👉对于【有名对象】而言,其生命周期在当前函数局部域

👉对于【匿名对象】而言,其生命周期在当前行

  • 这一块我们可以通过调试来进行观察,可以发现对于匿名对象执行完当前的这一行就直接去调用析构了,所以它的生命周期之后一行(其实不一定,看下去你就知道了)

 那知道了其特性后我们便可以去用一用这个匿名对象呢

三、匿名对象的对象类型

 匿名对象不仅可以是类类型,也可以是内置类型,比如 int、double 等等

  • 首先我们来看一下内置类型的匿名对象 
int main()
{
	cout << int() << endl;        // 0
	cout << double() << endl;    // 0
	return 0;
}
  •  可以看出,内置类型的匿名对象都是 0

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

template<typename T>
void Print(int n , const T& val = T())
{
	for (int i = 0; i < n; i++)
	{
		cout << val << " ";
	}
	cout << endl;
}

int main()
{
	cout << int() << endl;         // 0
	cout << double() << endl;      // 0
	Print<int>(5);           // 0 0 0 0 0
	Print<string>(5);        // 空
	return 0;
}

 四、匿名对象的使用

🍇简单场景的使用 

下面有一个类,现在我们要去调用这个类中的成员函数,你会如何去进行调用呢? 

class Solution {
public:
	int Sum_Solution(int n) 
	{
		cout << "Sum_Solution" << endl;
		return n;
	}
};
  • 相信最常规的做法就是像下面这样,实例化出一个对象,然后通过对象.函数名()的形式进行调用
Solution s;
s.Sum_Solution(1);
  • 但是呢,我直接使用下面这一种形式也可以做到,即【匿名对象】去进行调用,虽然这一种调用形式比较方便,但是呢是存在局限性的,我们只能调用这么一次,若是你想要多次调用类中的这个函数时,就需要去构造【有名对象】了,其生命周期是到程序结束为止的
Solution().Sum_Solution(2);

 🍉复杂场景的使用

 💬 请问下面这匿名对象可以被引用吗,快速回忆一下C++引用的相关知识

A& ra = A(1);
  • 编译一下可以发现是做不到的,如果你【C++引用】这一块学习扎实的话,相信很快就能想到是 权限放大 的问题,那这里为什么会造成权限放大呢?原因就在于这个匿名对象它和临时对象一样是具有常性的,那一个非常性的对象去引用常性的就会有问题了

  • 此时我们只需要在前面加上一个const即可
const A& ra = A(1);

💬 那我现在还想问题,这一块也是涉及引用相关的知识,因为这个匿名对象的生命周期只在这一行,那么此时这个ra是否会变成【野引用】呢?即引用了一块已经不存在的空间? 

  •   其实就是因为这个const常引用的原因,延长了匿名对象的生命周期,那么前面的对象ra是正常的对象,对这个匿名对象进行了引用即取了别名,那么就会在程序结束的时候才进行销毁

接下去我们再来看第二块,有关STL中的string 

  • 看到我这里是写了一个函数,形参部分是一个string的常引用
void push_back(const string &s)
{
	cout << s << endl;
}

然后我在下面写了调用这个函数的三种形式

  • 第一种是实例化对象然后去进行调用
  • 第二种采用的就是我们上面所学习的【匿名对象】
  • 第三种是直接传递了一个【常量字符串】进去,这中间会产生一个【临时对象】,然后进行隐式类型转换
  • 那你会更喜欢哪种方式呢,不用猜,一定是这第三种方式
// 1
string str("11111");
push_back(str);
// 2
push_back(string("22222"));
// 3
push_back("33333");
  •  对于第二种的【匿名对象】和第三种的【临时对象】,它们都具有一个常属性,所以在函数的形参部分不可以是普通的引用,不然就会产生一个权限放大的问题,加上const后就是权限平移,此时既可以接受普通引用也可以接收常引用,提高了代码的健壮性 

五、总结

1️⃣:匿名对象的生命周期非常短暂,只在当前语句中有效。一旦执行到语句结束,匿名对象就会被销毁。因此,无法在后续的代码中再次引用该对象。
2️⃣:匿名对象的对象可以为:类类型,也可以是内置类型

3️⃣:匿名对象也可以有自己的构造函数、析构函数和成员函数,它们的行为与具名对象一样。但由于匿名对象没有名称,所以无法直接访问它们。

六、共勉

   以下就是我对 C++ 匿名对象 的理解,如果有不懂和发现问题的小伙伴,请在评论区说出来哦,同时我还会继续更新对 C++STL库 的理解,请持续关注我哦!!!     

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何提高日语听力?日语学习日语培训柯桥小语种学校

每次一说起练日语听力&#xff0c;总离不开一个词&#xff0c;那就是“磨耳朵”。 可是&#xff0c;“磨耳朵”真的有用吗&#xff1f; 在讨论这个问题之前&#xff0c;我们需要先知道&#xff1a;什么是“磨耳朵”&#xff1f; 所谓的“磨耳朵”&#xff0c;其实就是让我们的耳…

C语言(操作符)2

Hi~&#xff01;这里是奋斗的小羊&#xff0c;很荣幸各位能阅读我的文章&#xff0c;诚请评论指点&#xff0c;关注收藏&#xff0c;欢迎欢迎~~ &#x1f4a5;个人主页&#xff1a;小羊在奋斗 &#x1f4a5;所属专栏&#xff1a;C语言 本系列文章为个人学习笔记&#x…

【JUC】并发编程 AQS,ReentryLock,CyclicBarrier,CountDownLatch 原理总结

AQS AQS是什么&#xff1f;重写AQS就能实现锁的效果&#xff1f; AQS是一个抽象类&#xff0c;是一个并发包的基础组件&#xff0c;用来实现各种锁&#xff0c;同步组件的工具&#xff08;通过volatile cas进行实现&#xff09;。它包含了共享成员变量state、等待队列、条件…

6层板学习笔记1

说明:笔记基于6层全志H3消费电子0.65MM间距BGA 目的:掌握各类接口的布局思路和布线,掌握DDR高速存储设计 1、网表的导入是原理图的元件电气连接关系,位号,封装,名称等参数信息的总和 2、原理图文件包含(历史版本记录,功能总框图,电源树,GPIO分配,DDR功能,CPU,US…

【跨境商家必读】TikTok Shop商城运营全指南

随着社交媒体和电子商务之间界限的日益模糊&#xff0c;一种全新的购物平台——TikTok商城&#xff0c;正在迅速成为全球跨境商家们关注的焦点。在这个竞争激烈的TikTok跨境电商领域中&#xff0c;了解如何有效利用TikTok Shop的各项功能&#xff0c;理解其独特的运营模式&…

OpenAI 高管:一年后,你会觉得现在的 ChatGPT 像笑话一样糟糕|TodayAI

OpenAI 的首席运营官 Brad Lightcap 表示&#xff0c;一年后&#xff0c;你会觉得现在的 ChatGPT 像笑话一样糟糕。未来的 ChatGPT 版本将会有重大升级。他还讨论了 AI 取代人类工作和对电网的压力的可能性。 虽然我们不知道 OpenAI 何时会推出 GPT-5&#xff0c;但公司高管已…

视频怎么去水印?这三款工具助你轻松搞定

在视频处理的过程中&#xff0c;水印常常成为我们的一大难题。它不仅影响了视频的美观度&#xff0c;还可能涉及版权问题。那么&#xff0c;如何高效去除视频中的水印呢&#xff1f;接下来&#xff0c;我将为大家推荐三款国内外备受好评的视频去水印工具&#xff1a;水印云、In…

【Linux】基础命令:进程、网络

systemctl命令 控制内置服务 systemctl start | stop | status | enable | disable 服务名 start | stop开启关闭&#xff0c;status状态&#xff0c;enable | disable开启关闭开机自启 date命令 查看系统时间 date [-d] [格式化字符串] date -d “1 day” %Y-%m-%d 修改时区…

数字电商人才孵化基地授牌仪式在天府锋巢直播产业基地隆重举行!

2024年4月25日&#xff0c;数字电商人才孵化基地授牌仪式在天府锋巢直播产业基地隆重举行。此次仪式不仅标志着德商锋巢与天府新区信息技术职业学院的紧密合作正式启动&#xff0c;更意味着双方在数字电商领域的人才培养和产业发展上迈出了坚实的步伐。 仪式现场&#xff0c;德…

中国家装水管十大品牌排行榜:联塑、日丰、金牛、美尔固、弗锐德等品牌上榜

水管作为家居装修中至关重要的一环&#xff0c;其质量直接关系到我们日常生活的安全和舒适。面对市场上琳琅满目的家装水管品牌&#xff0c;选择一款质量可靠、性能优越的产品成为了许多家庭装修的重要课题。为了助你选购时不踩坑&#xff0c;下面就为大家介绍一下中国家装水管…

【日志革新】在ThinkPHP5中实现高效TraceId集成,打造可靠的日志追踪系统

问题背景 最近接手了一个骨灰级的项目&#xff0c;然而在项目中遇到了一个普遍的挑战&#xff1a;由于公司采用 ELK&#xff08;Elasticsearch、Logstash、Kibana&#xff09;作为日志收集和分析工具&#xff0c;追踪生产问题成为了一大难题。尽管 ELK 提供了强大的日志分析功…

Sam Altman 在斯坦福大学演讲的 10 个要点

最近在斯坦福大学举行的问答环节中&#xff0c;OpenAI 富有远见的首席执行官 Sam Altman 分享了关于人工智能的未来及其对社会的潜在影响的宝贵见解。作为 GPT 和 DALL-E 等突破性人工智能模型背后的研究组织的联合创始人&#xff0c;Altman 的观点对于企业家、研究人员以及任何…

网盘应用:桌面端界面欣赏,这个赛道容不下小玩家。

网盘&#xff08;Cloud Storage&#xff09;是一种云存储服务&#xff0c;允许用户在互联网上存储、管理和共享文件。它提供了一个在线的虚拟硬盘&#xff0c;用户可以通过网络将文件上传到云端&#xff0c;并随时随地访问和管理这些文件。 阿里云盘

Redis集群.md

Redis集群 本章是基于 CentOS7 下的 Redis 集群教程&#xff0c;包括&#xff1a; 单机安装RedisRedis主从Redis分片集群 1.单机安装Redis 首先需要安装Redis所需要的依赖&#xff1a; yum install -y gcc tcl然后将课前资料提供的Redis安装包上传到虚拟机的任意目录&#xf…

为什么你创业总是失败?2024普通人如何创业?2024创业赛道!2024创业新风口!2024创业方向!2024普通人的机会!

为什么你做项目老是不赚钱&#xff0c;是你不够努力吗&#xff1f;是你运气不好吗&#xff1f; 如果都不是&#xff01;那一定是你的思维逻辑出了问题&#xff01; 先想一想你以前做的项目&#xff0c;有没有哪个符合以下条件&#xff1a;对客户有价值、寻找客源成本在可接受…

智慧文旅赋能旅游服务升级:以科技创新驱动行业变革,打造智慧化、个性化、高效化的旅游新体验,满足游客日益增长的多元化需求

目录 一、引言 二、智慧文旅的概念与内涵 三、智慧文旅在旅游服务升级中的应用 1、智慧旅游服务平台建设 2、智慧景区管理 3、智慧旅游营销 四、智慧文旅推动旅游行业变革的案例分析 案例一&#xff1a;某智慧旅游城市建设项目 案例二&#xff1a;某景区智慧化改造项目…

Linux进程状态与优先级

本篇详细的讲解了 Linux 中进程会出现的各种状态&#xff0c;以及出现这些状态的原因&#xff0c;其中进程的阻塞、挂起和运行就是进程状态的体现。接着科普了一下进程的切换&#xff0c;然后讲解了进程的优先级&#xff0c;以及如何调整进程的优先级。最后对进程的特点进行了总…

C语言自定义类型中结构体、结构体声明、结构体自引用、结构体变量的定义和初始化、结构体内存对齐,结构体传参,位段等的介绍

文章目录 前言一、结构体二、 结构体声明三、 特殊的声明----匿名结构体类型四、 结构体的自引用&#xff08;1&#xff09;数据结构&#xff08;2&#xff09;结构体的自引用 五、 结构体变量的定义和初始化六、 结构体内存对齐1. 结构体的对齐规则&#xff08;1&#xff09;结…

华为eNSP综合实验-网络地址转换

实验完成之后,在AR1的g0/0/1接口抓包,查看地址转换 实现私网pc访问公网pc 实验命令展示 SW1: vlan batch 12 #创建vlan interface e0/0/1 #进入接口配置vlan端口 port link-type access port default vlan 12 q interface e0/0/2 #进入接口配置vlan端口 port link-type ac…

iphone忘记锁屏密码怎么解锁?这些解锁方法你必须知道!

在使用iPhone的过程中经常会遇到很多问题&#xff0c;比如忘记了iPhone的锁屏密码。面对这样的情况&#xff0c;许多用户可能会感到手足无措。别担心&#xff0c;本文将为您详细介绍iPhone忘记锁屏密码的解锁方法&#xff0c;让您轻松解决这一烦恼。 一、使用iTunes备份恢复 如…