【C++指南】类和对象(八):匿名对象

         💓 博客主页:倔强的石头的CSDN主页 

           📝Gitee主页:倔强的石头的gitee主页

            ⏩ 文章专栏:《C++指南》

                                  期待您的关注

47f09392526c71b5885ec838a3ea7ffe.gif

引言

在C++编程中,匿名对象是一种特殊的对象,它在创建时没有被命名

这种对象通常用于在单个语句中执行一系列操作或调用某个函数,而不需要将结果存储到变量中。

本文将详细介绍C++中的匿名对象,包括其概念、类型、使用场景以及注意事项

目录

引言

🍃匿名对象的概念

🍃匿名对象的类型

🍃匿名对象的使用场景

🍃匿名对象的注意事项

🍃示例代码

结语


🍃匿名对象的概念

匿名对象是指在创建对象时没有给其命名,而是通过直接在类名后加一对空括号来实例化。

例如,对于一个名为Date的类,可以直接创建一个匿名对象Date()来调用它的构造函数或成员函数。

匿名对象的生命周期通常非常短暂,仅限于创建它的那一行代码。一旦执行到语句结束,匿名对象就会被销毁。因此,无法在后续的代码中再次引用该对象。

🍃匿名对象的类型

匿名对象可以是自定义的类类型,也可以是内置类型(如intdouble等)。

在C++中,内置类型原本没有构造函数,但有了模板之后,系统对这里进行了特殊处理,使得内置类型也可以有匿名对象。对于内置类型的匿名对象,如果不进行值初始化,其默认值通常为0。

🍃匿名对象的使用场景

  1. 简单场景

    当只需要临时使用一个对象并调用其成员函数时,可以使用匿名对象。例如,有一个类Solution,其中有一个成员函数Sum_Solution。可以通过Solution().Sum_Solution(2);的形式直接调用该函数,而不需要先实例化一个有名对象。

  2. 复杂场景

    在某些情况下,匿名对象可以作为函数参数传递。如果函数接受一个对象作为参数,并且有默认值,可以在调用函数时使用匿名对象作为实参。此外,匿名对象还可以用于避免不必要的拷贝构造,从而优化程序的性能。

  3. 与引用的结合

    需要注意的是,匿名对象被视为常量,不能通过它们修改成员变量的值。如果尝试用一个非常量引用来引用匿名对象,会导致编译错误。但是,可以用一个常量引用来引用匿名对象,此时匿名对象的生命周期会延长至引用作用域结束

🍃匿名对象的注意事项

  1. 生命周期

    匿名对象的生命周期仅限于创建它的那一行代码。一旦执行到语句结束,匿名对象就会被销毁。因此,无法在后续的代码中再次引用该对象。

  2. 不可再次引用

    由于匿名对象没有名称,因此无法直接访问它们。一旦匿名对象被销毁,就无法再次引用或操作它。

  3. 常量性

    匿名对象被视为常量,不能通过它们修改成员变量的值如果需要用引用来引用匿名对象,必须是一个常量引用

  4. 性能优化

    在某些情况下,使用匿名对象可以避免不必要的拷贝构造,从而优化程序的性能。但是,这需要在具体场景中权衡利弊。

🍃示例代码

以下是一个包含匿名对象使用的示例代码:

#include <iostream>  
#include <string>  
using namespace std;  class Person {  
public:  Person() {  cout << "Person默认构造" << endl;  }  Person(string name) {  cout << "Person有参构造" << endl;  m_name = name;  }  Person(const Person& per) {  cout << "Person拷贝构造" << endl;  m_name = per.m_name;  }  ~Person() {  cout << "析构析构析构" << endl;  }  void print_info() {  cout << "name: " << m_name << endl;  }  
private:  string m_name = "huahua";  
};  int main() {  Person per1; // 有名对象 -- 生命周期在当前函数局部域  per1.print_info();  Person().print_info(); // 匿名对象 -- 生命周期在当前行  Person("lili").print_info(); // 匿名对象 -- 生命周期在当前行  Person(per1).print_info(); // 匿名对象 -- 生命周期在当前行  system("pause");  return 0;  
}

 运行上述代码,将看到匿名对象在创建后立即调用析构函数被销毁的情况如下:

  • 匿名对象创建之后,生命周期只有一行,构造完成紧接着就是析构
  • 被常量引用的匿名对象生命周期被延长,匿名对象跟随引用的生命周期

  • mian()结束后,析构两个局部对象,先是被常量引用的匿名对象析构(因为同一域内 后构造的先析构),然后是有名对象per1被析构

结语

C++中的匿名对象提供了一种简洁的方式来执行一次性的操作,而不需要创建一个完整的命名对象。它们在需要临时对象的场景中非常有用,但需要注意的是,由于它们的生命周期较短,因此不能依赖于它们的持久性。在使用匿名对象时,需要权衡其带来的便利性和可能带来的性能影响。

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

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

相关文章

编译pytorch——cuda-toolkit-nvcc

链接 https://blog.csdn.net/wjinjie/article/details/108997692https://docs.nvidia.com/cuda/cuda-installation-guide-linux/#switching-between-driver-module-flavorshttps://forums.developer.nvidia.com/t/can-not-load-nvidia-drivers-on-ubuntu-22-10/239750https://…

智汇云舟参编《城市轨道交通安全防范系统技术要求》国标正式发布

近日&#xff0c;根据国家标准化管理委员会官网&#xff0c;全国标准信息公共服务平台发布的公告&#xff0c;国家标准《城市轨道交通安全防范系统技术要求》&#xff08;GB/T 26718-2024&#xff09;已由全国城市轨道交通标准化技术委员会上报国家标准化管理委员会&#xff0c…

45_Lua模块与包

Lua中的模块系统是该语言的一个重要特性,它允许开发者将代码分割成更小、更易于管理的部分。通过使用模块,你可以创建可重用的代码片段,并且可以降低代码间的耦合度。下面我将详细介绍Lua模块的基本概念、语法以及一些实际案例。 1.Lua模块 1.1 模块的基本概念 从Lua 5.1…

学习华为熵减:激发组织活力(系列之三)

目录 为什么学习华为&#xff1f; 学习华为什么&#xff1f; 一、势&#xff1a;顺势而为&#xff0c;在风口上猪都会飞起来。 二、道&#xff1a;就是认识和利用规律层面&#xff0c;文化和制度创新就是企业经营之道。 三、法&#xff1a;就是一套价值管理的变革方法论。…

Unity解决滑动条的value值的滑动条消失问题

在这里我们看到原本的value的滑动条消失了 解决办法 把编辑器的边框往外面拉一下就可以了&#xff08;之前遇到这个问题还重启了几次unity没想到居然是这个问题&#xff09;

HarmonyOS应用开发者初级认证最新版– 2025/1/13号题库新版

1.欢迎各位读者&#xff0c;本文档来自鸿蒙开发学员亲测&#xff0c;最新版。&#xff08;考试时直接Ctrlf进行搜索&#xff0c;一定要认真比对答案&#xff0c;有的答案相似度很高&#xff09;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 欢迎…

kubernetes v1.29.XX版本HPA、KPA、VPA并压力测试

序言&#xff1a; 在大型电商、购物、直播活动期间&#xff0c;对于火爆流量的激增&#xff0c;如何保障业务稳定并且做到资源不浪费&#xff0c;自动回收。 场景&#xff1a;kubernetes 原生容器化承载业务流量&#xff08;非云环境&#xff09; 方案&#xff1a;kubernetes自…

HarmonyOS NEXT应用开发边学边玩系列:从零实现一影视APP (五、电影详情页的设计实现)

在上一篇文章中&#xff0c;完成了电影列表页的开发。接下来&#xff0c;将进入电影详情页的设计实现阶段。这个页面将展示电影的详细信息&#xff0c;包括电影海报、评分、简介以及相关影人等。将使用 HarmonyOS 提供的常用组件&#xff0c;并结合第三方库 nutpi/axios 来实现…

亲测解决CUDA error: device-side assert triggered

这个问题小虎今天刚刚遇到&#xff0c;问题原因有很多。但是由于使用了cuda运行&#xff0c;报错看不出来。解决方法是用cpu运行来看错误出在哪里。 环境 Python version is: 3.10.13 | packaged by Anaconda, Inc. | (main, Sep 11 2023, 13:24:38) [MSC v.1916 64 bit (AMD…

Vulnhub DC-8靶机攻击实战(一)

导语   Vulnhub DC-8靶机教程来了,好久没有更新打靶的教程了,这次我们在来更新一期关于Vulnhub DC-8的打靶训练,如下所示。 安装并且启动靶机 安装并且启动靶机,如下所示。 开始信息采集 进入到Kali中,通过如下的命令来查找到靶机的IP地址。 arp-scan -l根据上面的结…

神经网络基础-正则化方法

文章目录 1. 什么是正则化2. 正则化方法2.1 Dropout正则化2.2 批量归一化(BN层) 学习目标&#xff1a; 知道正则化的作用掌握随机失活 DropOut 策略知道 BN 层的作用 1. 什么是正则化 在设计机器学习算法时希望在新样本上的泛化能力强。许多机器学习算法都采用相关的策略来减小…

【Linux】12.Linux进程概念(1)

文章目录 1. 冯诺依曼体系结构2. 操作系统(Operator System)概念设计OS的目的胆小的操作系统定位如何理解 "管理"总结 3. 进程基本概念task_struct-PCB的一种task_ struct内容分类组织进程查看进程通过系统调用获取进程标示符通过系统调用创建进程-fork初识 1. 冯诺依…

【Linux网络编程】序列化与反序列化

目录 一&#xff0c;序列化和反序列化的说明 二&#xff0c;Jsoncpp库的介绍 三&#xff0c;Jsoncpp库的使用 3-1&#xff0c;Json::Value类 3-2&#xff0c;Json::StreamWriter类 3-3&#xff0c;Json::CharReader类 一&#xff0c;序列化和反序列化的说明 序列化与反…

解决 多层跳板机情况下,ssh可以成功连但是VSCode失败

ssh bbbb -p 22 -J aaaa 成功&#xff0c;但是用 VSCode 如下配置连接失败&#xff1f; Host aaHostName aaUser aaHost bbHostName bbUser bbProxyCommand C:\Windows\System32\OpenSSH\ssh.exe -W %h:%p aa同时&#xff0c;VSCode 连接 aa 成功。那么问题出在哪里&#xff1…

Oracle报错ORA-01078、LRM-00109

虚拟机异常关机后&#xff0c;rac数据库备机无法启动数据库&#xff0c;报错如下 解决方法&#xff1a; 找到如下路径文件 执行&#xff1a; cp init.ora.016202516818 /u01/app/oracle/product/19.3.0/db/dbs/ mv init.ora.016202516818 initplm2.ora 再次进入命令行sqlpl…

MySQL SQL优化技巧与原理

前言 随着业务数据量的不断增加&#xff0c;MySQL查询语句的执行效率对程序的运行效率影响逐渐增大。因此&#xff0c;进行SQL优化变得至关重要。本文将结合SQL的执行语句顺序和各种SQL场景&#xff0c;介绍一些常见的MySQL SQL优化技巧及其背后的原理。 一、MySQL SQL执行语…

移动端H5缓存问题

移动端页面缓存问题是指页面的静态资源&#xff08;如图片、JS 和 CSS 文件&#xff09;在浏览器中被缓存后&#xff0c;用户在下次访问时可以直接从本地获取缓存数据&#xff0c;而不需要每次都从服务器重新获取&#xff0c;不过这样可能会导致页面不能正确地更新或者加载最新…

长安“战疫”网络安全公益赛的一些随想

起因 今年刚进入大学&#xff0c;开始带校队&#xff0c;为了培养校队新成员&#xff0c;也就一直计划着和当地的一些高校合作交流&#xff0c;但是由于种种原因一直被搁置下来。正巧学校信息中心和四叶草有一个培训项目的合作&#xff0c;学校的网安协会也算是沾了光成为了培…

STM32-keil安装时遇到的一些问题以及解决方案

前言&#xff1a; 本人项目需要使用到STM32,故需配置keil 5&#xff0c;在配置时遇到了以下问题&#xff0c;并找到相应的解决方案&#xff0c;希望能够为遇到相同问题的道友提供一些解决思路 1、提示缺少&#xff08;missing&#xff09;version 5编译器 step1&#xff1a;找…

1.1.1 C语言常用的一些函数(持续更新)

总框架见&#xff08;0. 总框架-CSDN博客&#xff09; &#xff08;1&#xff09;socket (a)分配fd&#xff1b;(b)分配tcp控制块(tcb) int socket(int domain, int type, int protocol);AF_INET IPv4 Internet protocols ip(7)AF_INET6 IP…