【C++】认识匿名对象

news2024/11/23 8:06:39

文章目录

目录

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

前言

在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;    // 0
	cout << double() << endl; // 0

	return 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.coloradmin.cn/o/2196756.html

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

相关文章

常用动词敬语形式大揭秘,柯桥零基础日语培训

一、常用动词的敬语形式 1. する&#xff08;做&#xff09; • 尊敬语&#xff1a; なさる (Nasaru) 例&#xff1a;社長はよく運動をなさいます。 &#xff08;社长经常锻炼。&#xff09; • 谦逊语&#xff1a; いたす (Itasu) 例&#xff1a;この仕事は私がいたします。 &…

Java解析图形mdb矢量mdb

Java解析图形mdb矢量mdb 背景&#xff1a;项目中需要解析图形mdb&#xff0c;同事积累下的代码无法读取复杂图形&#xff1b;终于在某位大佬的博客下发现新的 解析方法&#xff0c;特此整理记录下。原理&#xff1a;jackcess&#xff08;assess提供解析mdb属性&#xff09;、es…

C++模拟实现二叉搜索树

目录 1.二叉搜索树的概念 2.二叉搜索树的性能分析 3.二叉搜索树的结构和中序遍历 3.1二叉搜索树中节点的结构 3.2二叉搜索树的结构 3.3中序遍历 4.二叉搜索树的插入 5.二叉搜索树的查找 6.二叉树搜索树的删除 7. 二叉搜索树的默认成员函数 8.参考代码 9.二叉搜…

常见的图像处理算法:Canny边缘检测

一、Canny边缘检测算子的由来 Canny 边缘检测算子是一种多级检测算法。1986 年由 John F. Canny 提出&#xff0c;同时提出 了边缘检测的三大准则&#xff1a; 1、低错误率的边缘检测&#xff1a;检测算法应该精确地找到图像中的尽可能多的边缘&#xff0c;尽可能的减少漏检…

【一起学Rust | 框架篇 | Tauri2.0框架】高级概念之安全特性的权限与能力

文章目录 前言一、开发前准备1. 准备项目2. 需求分析1. 监听系统热键2. 切换窗口无边框3. 切换窗口全屏 二、安装插件三、前端实现功能四、配置权限 前言 当前时间为 2024 年 9 月&#xff0c;距离Tauri 2.0 的 RC 版本发布迄今已近一个月。从 Tauri 官方渠道可以看出&#xf…

李飞飞:我不知道什么是AGI

图片来源&#xff1a;Stanford University 你对人工通用智能&#xff08;AGI&#xff09;感到困惑吗&#xff1f;这就是 OpenAI 执着于最终以“造福全人类”的方式创造的东西。你可能想认真对待他们&#xff0c;因为他们刚筹集了 66 亿美元以更接近这个目标。 但如果你仍然在…

揭秘Sui存储基金:灵活且可持续的链上数据管理解决方案

链上数据存储的方法常常被忽视&#xff0c;因为所使用的机制通常是传统和常见的。然而&#xff0c;在去中心化网络中&#xff0c;数据存储对确保数据完整性和长期可访问性至关重要。Sui的链上存储与其他区块链有所不同。 Sui存储基金是为了解决链上数据永久存储问题而设计的核…

企业架构系列(16)ArchiMate第14节:实施和迁移视角

在企业架构中&#xff0c;为了有效地规划和管理架构的变更与实施&#xff0c;通常会使用不同的视角来描述架构的不同方面。本篇涉及到三个主要视角&#xff1a;项目视角、迁移视角以及实施与迁移视角。 一、实施和迁移视角概览 1.项目视角 元素与关系&#xff1a;关注项目本身…

“网络安全等级保护测评入门:基础概念与重要性“

网络安全等级保护测评&#xff08;简称“等保测评”&#xff09;是依据国家网络安全等级保护制度&#xff0c;对信息系统安全等级进行评估和评定的过程。它是提高信息系统安全性、保障信息安全的重要手段。以下是关于等保测评的基础概念与重要性的详细解读&#xff1a; 一、等…

【钱拿不回来了,中介说开源吧】《刚体旋转的四元数模型及捷联惯性导航系统中定向算法》

《刚体旋转的四元数模型及捷联惯性导航系统中定向算法》 1. 摘要 本文深入探讨了四元数在刚体旋转描述中的核心作用以及其在捷联惯性导航系统&#xff08;SINS&#xff09;中确定方向的算法。详细阐述了四元数的理论基础、数学性质和实际应用优势&#xff0c;包括与卡丹角和欧…

小红书AI商单变现,单月收入10000+,真猛!

AI相关的话题在这两年来一直很火爆&#xff0c;很多行业也纷纷和AI结合起来&#xff0c; 从而达到更好的变现效果&#xff0c;这也是未来的发展趋势&#xff0c; 有这个工具确实能给我们的工作和生活带来一些便利 之前也拆解过很多类似的玩法&#xff0c; 比如AI古诗词、数…

软件测试之压力测试

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 压力测试 压力测试是一种软件测试&#xff0c;用于验证软件应用程序的稳定性和可靠性。压力测试的目标是在极其沉重的负载条件下测量软件的健壮性和错误处理能力&…

GSLAM——一个通用的SLAM架构和基准

GSLAM: A General SLAM Framework and Benchmark 开源地址 摘要&#xff1a; SLAM技术最近取得了许多成功&#xff0c;并吸引了高科技公司的关注。然而&#xff0c;如何同一现有或新兴算法的界面&#xff0c;一级有效地进行关于速度、稳健性和可移植性的基准测试仍然是问题。本…

芯片干货 | 同步内置MOS升压恒压5V/2A芯片FP6276B,输入限流可调

芯片概述 FP6276B是一个具有PWM/PSM控制的电流模式增压直流-直流转换器。它的PWM电路内置40mΩ高侧开关和40mΩ低侧开关使该调节器高高效。内部补偿网络还将外部组件计数最小化到只有6个。一个内部的0.6V电压被连接到误差放大器的非反相输入作为精度参考电压。内置的软启动功能…

Llama 3.2 智能代理开发教程

构建研究代理可能很复杂&#xff0c;但使用 LangChain 和 Ollama&#xff0c;它会变得更加简单和模块化。 在本教程中&#xff0c;我们将向你展示如何基于Llama 3.2创建一个研究代理&#xff0c;该代理可以路由查询、执行网络搜索并使用工作流和 LLM 的组合生成详细响应。最后…

我的书第三次重印啦,做一波活动,参与可抽现金红包~

大家好&#xff0c;我是拭心&#xff0c;好久不见。 四月份我的《Android 性能优化入门与实战》顺利出版&#xff0c;在朋友们帮忙宣传下&#xff0c;初印的两三千册很快卖完&#xff0c;四月份第二次重印&#xff0c;五个月后&#xff0c;又迎来了第三次重印。 这样的销量算不…

如何解决Lenovo笔记本电脑很快就自动休眠,自动锁屏,需要密码登录的问题

前段时间电脑经常会很快就锁屏了&#xff0c;只要离开电脑1分钟不到&#xff0c;就自动锁屏&#xff0c;然后就要输入密码登录&#xff0c;太烦了&#xff0c;后来百度和谷歌了不少帖子和方案&#xff0c;给的建议都是调整电源选项之类的参数。 尝试了各种修改参数&#xff0c…

栈和队列--DS

1. 栈(Stack) 1.1 栈的定义 **栈是一种特殊的线性表&#xff0c;其只允许在固定的一端(栈顶)进行元素插入和删除元素操作。**进行数据插入和删除操作的一段称为栈顶&#xff0c;另一端则称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)原则。 1.2 栈的核心操…

Android 无Bug版 多语言设计方案!

出海业务为什么要做多语言&#xff1f; 1.市场扩大与本地化需求&#xff1a; 通过支持多种语言&#xff0c;出海项目可以触及更广泛的国际用户群体&#xff0c;进而扩大其市场份额。 本地化是吸引国际用户的重要策略之一&#xff0c;而语言本地化是其中的核心。使用用户的母语…

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

目录 1. 答案速查 分析 源代码分析 反汇编代码分析(底层) 2. 答案速查 分析 3. 答案速查 分析 VS逐步调试 1. 求下列代码的执行结果 #include <stdio.h> char* GetMemory(void) {char p[] "hello world";return p; }void Test(void) {char* str…