尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
类和对象(4)
1.匿名对象⽤类型(实参)定义出来的对象叫做匿名对象相⽐之前我们定义的 类型对象名(实参)定义出来的 叫有名对象。匿名对象⽣命周期只在当前⼀⾏⼀般临时定义⼀个对象当前⽤⼀下即可就可以定义匿名对象。形式类名括号class A { public: A(int a 0) :_a(a) { cout A(int a) endl; } ~A() { cout ~A() endl; } private: int _a; }; class Solution { public: int Sum_Solution(int n) { //... return n; } }; int main() { //1.普通对象 A aa1;//生命周期在整个main函数作用域 A aa21; // A aa1();不能这么定义对象因为编译器无法识别下面是⼀个函数声明还是对象定义 // 例如A func();返回值是A类型的函数声明无法区分 //但是我们可以这么定义匿名对象匿名对象的特点不用取名字 //但是他的⽣命周期只有这⼀⾏我们可以看到下⼀⾏他就会⾃动调⽤析构函数 //2.匿名对象 //匿名对象类似于临时对象匿名对象是我们主动创建的临时对象是编译器自己产生的。 A();//生命周期只在当前这一行 A(1); //匿名对象使用场景匿名对象在这样场景下就很好用,调用Sum_Solution函数 //一般情况下 Solution s1; cout s1.Sum_Solution(10) endl; //有了匿名对象后 cout Solution().Sum_Solution(10) endl; return 0; }2.对象拷⻉时的编译器优化现代编译器会为了尽可能提⾼程序的效率在不影响正确性的情况下会尽可能减少⼀些传参和传返 回值的过程中可以省略的拷⻉。如何优化C标准并没有严格规定各个编译器会根据情况⾃⾏处理。当前主流的相对新⼀点的编 译器对于连续⼀个表达式步骤中的连续拷⻉会进⾏合并优化有些更新更激进的编译器还会进⾏ 跨⾏跨表达式的合并优化类型转换传参编译器做的优化class A { public: A(int a 0) :_a1(a) { cout A(int a) endl; } A(const A aa) :_a1(aa._a1) { cout A(const A aa) endl; } ~A() { cout ~A() endl; } private: int _a1; }; void f1(A aa) { } int main() { //隐式类型转换构造拷贝构造》优化后直接构造 A aa1 1; cout endl endl; //传值传参-》无优化 A aa2;//调用构造函数 f1(aa2);//调用拷贝构造函数 cout endl endl; //构造拷贝构造》优化后直接构造 f1(A()); cout endl endl; //隐式类型转换构造拷贝构造》优化后直接构造 f1(1); cout endl endl; return 0; }A f2() { A aa; return aa;//传值返回不会用返回对象aa直接作为表达式的返回值 //而是调用拷贝构造产生一个返回值 //但编译器优化后 //aa 这个对象不在 f2 结束时析构而是推迟到调用者用完返回值之后才析构。 } int main() { f2(); return 0;; }A f2() { A aa; cout aa endl; return aa; } int main() { f2(); //传值返回不会用返回对象aa直接作为表达式的返回值 //而是调用拷贝构造产生一个返回值 //但编译器优化后只会调用一次构造 //aa 这个对象不在 f2 结束时析构而是推迟到调用者用完返回值之后才析构。 cout endl; A aa1 f2();//aa是aa1的一个别名先创建aa1编译器进行了极大的优化 cout aa1 endl; cout endl; return 0; }aa3不能和aa是同一块空间可能A aa3;与aa3f2()之间会做一些其他事情。不优化构造构造拷贝赋值运算符重载》优化后构造构造赋值(不产生临时对象)总结传参时尽可能不要使用传值传参尽可能使用匿名对象或者类型转换的方式传参A aa1(1); f1(aa1)//有名对象传参不推荐f1(A(1))//推荐匿名对象传参f1(1)//隐式类型转换传参传值返回接收返回值推荐使用拷贝构造方式接收返回值A aa2 f2();//推荐A aa3; aa3 f2();//不推荐
RELATED

相关推荐

SSSSSSSS

SSSSSSSS

SSSSSSSSSSSSSSSSSSSSSSSSSSSS

📅 2026/10/30 8:20:21
三个 root 密码别搞混:ESXi 上两阶段部署 vCenter Server 7.0 排错指南

三个 root 密码别搞混:ESXi 上两阶段部署 vCenter Server 7.0 排错指南

vSphere 7.0 起,vCenter Server 只剩 Linux 版(VCSA),安装被拆成两个阶段,全程要设三套密码。新手最常见的翻车不是装失败,而是把三套密码记混,最后登录不上管理界面。这篇把三个密码的身份分清…

📅 2026/10/30 8:20:21
明确任务边界,设计验收标准,沉淀可复用能力,并把每一次构建转化为长期资产

明确任务边界,设计验收标准,沉淀可复用能力,并把每一次构建转化为长期资产

2026年10月24日至25日,以“具身同行,智构未来”为主题的2026长沙1024程序员日暨AI构建者大会在世界计算长沙智谷举办。大会由CSDN主办,线下参会规模超过1500人,设置“一主会、三论坛、四构建”,并同步开放1024展会与街…

📅 2026/10/30 8:20:21
MORE NEWS

更多资讯

📰

Go应用在Docker中的时区问题与解决方案

1. 为什么需要关注Go应用在Docker中的时区问题在开发基于Go语言的微服务应用时,我们经常会将应用打包为Docker镜像进行部署。但很多开发者会遇到一个看似简单却影响深远的问题——容器内的时间显示与预期不符。这通常表现为日志时间戳、定时任务触发时间或API返回的…

📰

效率工具链怎么搭:采集到沉淀的工作流与自动化脚本

做内容、写代码、跑项目这些年,我电脑里装过的工具少说也有三位数,从最初“看到推荐就收藏”的松鼠症,到现在桌面干净得能反光,中间扔掉的东西比留下来的多得多。写这篇的起因很简单:一位刚入行的朋友问我“你到底用什…

📰

socat热更新工具实现零停机服务运维

1. 理解socat热更新工具的核心价值 socat作为一款功能强大的网络工具,常被比作"网络瑞士军刀"。它能在不同协议之间建立双向数据传输通道,支持TCP、UDP、SSL、文件等多种数据流。而热更新能力则是现代服务运维中的刚需,它允许我们在…

📰

多模态Agent架构演进:从脚本到状态机的实践

1. 从脚本到状态机:多模态Agent架构演进之路在构建复杂AI系统的过程中,我们常常会经历从简单脚本到状态机的架构演进。最近我在重构一个多模态客服系统时,深刻体会到这种转变的必要性。最初的版本是基于LangChain的线性脚本,但随着…

📰

Android原生频谱可视化:FFT实时分析与均衡器深度实践

简介:这是一份面向Android开发初学者与进阶者的音视频可视化实战DEMO,聚焦音乐播放器核心功能实现,尤其适合希望掌握音频频谱动态渲染与均衡器集成的开发者。资源完整呈现了类似千千静听风格的跳动频谱效果——基于FFT频域分析、Canvas实时绘…

📰

Vue3+Element-Plus+Mock.js前端骨架:按需引入与联调切换

简介:面向希望快速熟悉 Vue3 新语法与前端工程化流程的开发者,这套 vue3-demo 以 Vue3 框架配合 Element-Plus 组件库搭建基础工程,并预置 Mockjs 假数据与 axios 请求工具,已经完成表格组件的引入与页面示例,解压后即…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬