【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;        // 0cout << double() << endl;    // 0return 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;         // 0cout << double() << endl;      // 0Print<int>(5);           // 0 0 0 0 0Print<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库 的理解,请持续关注我哦!!!     

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

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

相关文章

一文解决ArcGIS生成点和管段 含案例讲解

背景 在工作中&#xff0c;我们经常遇到要将坐标数据导入 GIS&#xff0c;生成点位&#xff0c;若是地理坐标系&#xff08;经纬度&#xff09;&#xff0c;那么直接用 arcgis或者QGIS 导入数据就行了&#xff0c;可实际中总会遇到各种问题&#xff1a; 坐标数据集为大地 200…

《大数据最全面试题-Offer直通车》目录

大数据时代已经到来&#xff0c;数据科学家、大数据工程师、数据分析师等岗位成为了热门职业。如果你正准备面试&#xff0c;想要脱颖而出&#xff0c;那么《大数据最全面试题-Offer直通车》是你的不二选择。 本书汇集了多篇超过1万字的精华内容&#xff0c;包括程序员入职新公…

如何使用Go语言进行基准测试(benchmark)?

文章目录 一、基准测试的基本概念二、编写基准测试函数三、运行基准测试四、优化代码性能五、注意事项总结 在Go语言中&#xff0c;基准测试&#xff08;benchmark&#xff09;是一种评估代码性能的有效方式。通过基准测试&#xff0c;我们可以测量代码执行的时间、内存使用情况…

requestbody无法将json字符串转为相应类

报错问题&#xff1a;"requestbody无法将json字符串转为相应类" 通常意味着在使用Spring框架的REST API时&#xff0c;客户端发送的JSON数据无法被正确地解析为服务器端预期的Java对象。 可能的原因和解决方法&#xff1a; JSON格式错误&#xff1a;确保客户端发送的…

【Linux】详解core dump文件的作用以及用法ubuntu20.04下无法形成core dump文件的解决办法

说明 从第三大点开始讲解ubuntu20.04下无法形成core dump文件的解决办法。 一、core与term的区别 在之前讲过的信号中&#xff0c;终止进程的信号的动作分为两种&#xff0c;一种是core&#xff0c;一种是term。term&#xff08;全称termination&#xff09;是直接终止进程&am…

HTML_CSS学习:CSS像素与颜色

一、像素 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>像素</title> </head><style>.atguigu1{/*单位可以是cm&#xff0c;但不能是m,dm*/width: 1cm;height: 1cm;background-c…

Java语法day1

Java语法day1 一、选择题二、编程题 一、选择题 1、派生类调用基类的构造器必须用到的关键字&#xff08;C&#xff09; A: this B: final C: super D: static 说明&#xff1a;调用父类的构造器或者父类的方法&#xff0c;要用关键字super 2、以下哪个接口的定义是正确的&am…

C++ string类

目录 0.前言 1.为什么学习string类 1.1 C语言字符串的局限性 1.2 C string类的优势 2.标准库中的string类 2.1 字符串作为字符序列的类 2.2 接口与标准容器类似 2.3 基于模板的设计 2.4 编码和字符处理 3.string类的常用接口说明 3.1构造函数 3.1.1默认构造函数 3…

GPU 架构与 CUDA 关系 并行计算平台和编程模型 CUDA 线程层次结构 GPU 的算力是如何计算的 算力峰值

GPU 架构与 CUDA 关系 本文主要包含 NVIDIA GPU 硬件的基础概念、CUDA(Compute Unified Device Architecture)并行计算平台和编程模型,详细讲解 CUDA 线程层次结构,最后将讲解 GPU 的算力是如何计算的,这将有助于计算大模型的算力峰值和算力利用率。 GPU 硬件基础概念GP…

Unity Timeline学习笔记(5) - 自定义轨道切片上变量Transform对象丢失,使用ExposedReference来解决。

问题 我在笔记(4)中后来又引用了Hierarchy中的Transform对象Transform obj&#xff0c;发现一些问题。 要么无法拖入进去对象&#xff0c;要么拖入进去保存后&#xff0c;再次编辑或者运行的时候发现obj丢失了。 我们还是用修改下笔记&#xff08;4&#xff09;的部分代码来…

linux查看端口占用

以3040端口为例 要查看在Linux系统中哪个程序占用了3040端口&#xff0c;可以使用lsof命令或netstat命令结合适当的参数。这里提供两种常用的方法&#xff1a; 方法1&#xff1a;使用 lsof 命令 lsof&#xff08;List Open Files&#xff09;是一个查看当前系统打开文件的工…

Django后台项目开发实战二

我们的需求是开发职位管理系统 三个功能&#xff1a; 管理员发布职位候选人能浏览职位用户能投递职位 第二阶段 创建应用 jobs&#xff0c;实现职位数据的建模 python manage.py startapp jobs 然后再 setting .py 注册应用&#xff0c;只需添加应用名称到最后一行 INST…

实验报告5-Spring MVC实现页面

实验报告5-SpringMVC实现页面 一、需求分析 使用Spring MVC框架&#xff0c;从视图、控制器和模型三方面实验动态页面。模拟实现用户登录&#xff0c;模拟的用户名密码以模型属性方式存放在Spring容器中&#xff0c;控制器相应用户请求并映射参数&#xff0c;页面收集用户数据或…

Golang实现一个批量自动化执行树莓派指令的软件(7)辅助模块-本地活动网络

简介 为了更方便的使用&#xff0c;我们将实现一个可以扫描本地连接网络中可用连接的扫描功能&#xff0c; 扫描本地连接网络中有哪些连接的设备主机。 环境描述 运行环境: Windows&#xff0c; 基于Golang&#xff0c; 暂时没有使用什么不可跨平台接口&#xff0c; 理论上支持…

Vue入门到关门之Vue介绍与使用

一、vue框架介绍 1、什么是Vue&#xff1f; Vue (读音 /vjuː/&#xff0c;类似于 view) 是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是&#xff0c;Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层&#xff0c;不仅易于上手&#xff0c;还便于与…

acwing算法提高之数据结构--可持久化数据结构

目录 1 介绍2 训练 1 介绍 本专题用来记录可持久化数据结构相关的题目。 本专题主要讲如下两类数据结构的可持久化&#xff1a; trie的可持久化线段树的可持久化&#xff0c;即主席树 可持久化的前提&#xff1a;本身的拓扑的结构不变。 解决什么类型的问题&#xff1a;可…

【图论】图论基础

图论不同地方讲的不太一样&#xff0c;本文仅限作者的理解 定义 图一般由点集 V V V 和边集 E E E 组成。 对于 v ∈ V v\in V v∈V&#xff0c;称 v v v 为该图的一个节点。 对于 e ∈ E e\in E e∈E&#xff0c;一般用二元组 ( u , v ) (u,v) (u,v) 表示 e e e&…

Linux 根据提交记录生成补丁及新旧文件对比

#!/bin/bash#解决/bin/bash^M: bad interpreter: Text file busy #sed -i s/\r$// test1.shCMD1$1 CMD2$2 CMD3$3 echo "CMD1 > $CMD1" echo "CMD2 > $CMD2" echo "CMD3 > $CMD3" # 运行时的入参 CMD1提交记录1 CMD2提交记录2 CMD3输出…

短视频素材有哪些方法获得?推荐8个短视频素材免费资源

在这个视觉内容至关重要的时代&#xff0c;拥有高质量视频素材对于任何视频创作者来说都是必不可少的。视频素材不仅可以增强叙事的深度&#xff0c;还能显著提升观众的参与度。为了帮助你找到理想的视频素材&#xff0c;以下是全球范围内提供顶级视频素材的网站列表&#xff0…

基于FPGA的数字信号处理(5)--Signed的本质和作用

前言 Verilog中的signed是一个很多人用不好&#xff0c;或者说不太愿意用的一个语法。因为不熟悉它的机制&#xff0c;所以经常会导致运算结果莫名奇妙地出错。其实了解了signed以后&#xff0c;很多时候用起来还是挺方便的。 signed的使用方法主要有两种&#xff0c;其中一种…