c++ 产生临时对象的情况和解决方案

1 以传值的方式给函数攒底参数。

这个不用说,值传递。

2 类型转换生成的临时对象/隐式类型转换以保证函数调用成功

举例1:

# include <iostream>using namespace std;class CTempValue
{
public:int val1;int val2;
public:CTempValue(int v1 = 0, int v2 = 0); //构造函数CTempValue(const  CTempValue& t) : val1(t.val1), val2(t.val2) //拷贝构造函数{cout << "调用了拷贝构造函数!" << endl;};virtual ~CTempValue() //析构函数{cout << "调用了析构函数!" << endl;};CTempValue& operator=(const CTempValue& tmpv){//不能用初始化列表,只有构造函数才有初始化列表val1 = tmpv.val1;val2 = tmpv.val2;cout << "调用了拷贝赋值运算符!" << endl;return *this;}public://int Add(CTempValue tobj); //普通成员函数int Add(CTempValue& tobj); //普通成员函数
};CTempValue::CTempValue(int v1, int v2) :val1(v1), val2(v2)
{cout << "调用了构造函数!" << endl;cout << "val1 = " << val1 << endl;cout << "val2 = " << val2 << endl;
}//int CTempValue::Add(CTempValue tobj)
//{
//	int tmp = tobj.val1 + tobj.val2;
//	tobj.val1 = 1000;            //这里修改对外界没什么影响
//	return tmp;
//}
int CTempValue::Add(CTempValue& tobj)
{int tmp = tobj.val1 + tobj.val2;tobj.val1 = 1000;            //这里修改对外界直接产生影响return tmp;
}int main(int argc, char** argv)
{CTempValue sum;sum = 1000;return 0;
}
===================================
(base) ➜  ./b
调用了构造函数!
val1 = 0
val2 = 0
调用了构造函数!
val1 = 1000
val2 = 0
调用了拷贝赋值运算符!
调用了析构函数!
调用了析构函数!

将100赋值给sum,会触发 1000为构造函数的第一个形参赋值,构造一个临时对象,再调用复制赋值运算符,将值赋值给sum。

举例2:

#include <string>using namespace std;int calc(const string& strsource, char ch)
{const char* p = strsource.c_str();int icount = 0;//....具体的统计代码return icount;
}
int main(int argc, char** argv){char mystr[100] = "I love China,oh,yeah!";int result = calc(mystr, 'o'); //看调用的是哪个calc函数return 0;
}

由于calc的形参和mystr的类型不一样,在调用函数的时候,函数calc第一个参数会触发编译器为我们产生一个类型为string的临时对象,临时对象的构造方式就是用mystr作为参数,调用string的构造函数,这样形参就绑定到了这个string临时对象上。当calc返回的时候,这个临时对象会被自动销毁。

注意:string& strsource前必须加const,strsource是一个引用,如果不加const系统会认为,该值有可能会被修改,但是,strsource是一个临时对象,不能被修改,所以c++标准不允许这种倾向。c++只会为const引用产生临时对象,并不会为非const引用创建临时对象。

3 函数返回对象的时候

函数返回对象,内部会通过要返回的值调用拷贝构造函数创建临时对象,再析构原对象。

CTempValue Double(CTempValue& ts)
{CTempValue a(ts.val1 * 2, ts.val2 * 2);return a;
}
int main(int argc, char** argv)
{CTempValue ts1(10, 20);CTempValue ts3 = Double(ts1);cout << "p = "<< &ts3 <<endl;return 0;
}==================
调用了构造函数! p = 0x16dca9460          ==ts1
val1 = 10
val2 = 20
调用了构造函数! p = 0x16dca93e0         == a
val1 = 20
val2 = 40
调用了拷贝构造函数! p = 0x16dca9440     ==临时对象
调用了析构函数! p = 0x16dca93e0        == 析构a
调用了拷贝构造函数! p = 0x16dca9450     == 临时对象到ts3拷贝构造
调用了析构函数! p = 0x16dca9440        == 析构临时对象
p = 0x16dca9450
调用了析构函数! p = 0x16dca9450        == 析构ts3
调用了析构函数! p = 0x16dca9460        == 洗头ts1

如果开启编译优化,ts3会直接接管临时对象。少一个拷贝构造。【double函数返回的临时对象直接使用了ts3的预留空间】。

4 类外的运算符之中的优化

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

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

相关文章

在spring框架的基础上自定义autowired注解

在Spring框架的基础上自定义Autowired注解是不可能的&#xff0c;因为注解本身是Java语言的一部分&#xff0c;并且Autowired是Spring框架提供的注解&#xff0c;用于实现自动装配。但是&#xff0c;你可以创建自己的注解&#xff0c;并结合Spring框架的扩展机制来实现类似的功…

3DMAX样条线轮廓修改器插件SplineOffset安装使用方法

3DMAX样条线轮廓修改器插件安装使用教程 3DMAX样条线轮廓插件SplineOffset是3dMax的一个修改器&#xff0c;它可以创建多个样条线克隆&#xff0c;并可以选择增量增加或减少偏移、平移和旋转。在许多方面&#xff0c;它类似于3dMax的内置阵列工具与样条线偏移功能相结合。 3DM…

享元模式介绍(含案例代码)

学习目标&#xff1a; 了解享元模式 学习内容&#xff1a; 享元模式&#xff08;Flyweight Pattern&#xff09;是一种结构型设计模式&#xff0c;旨在减少创建对象的数量&#xff0c;以节省内存和提高性能。这个模式通过共享尽可能多的细节来有效地支持大量细粒度对象。 享元…

PTA 7-7 后序和中序构造二叉树

本题目要求用后序序列和中序序列构造一棵二叉树&#xff08;树中结点个数不超过10个&#xff09;&#xff0c;并输出其先序序列。 输入格式: 在第一行中输入元素个数。 第二行中输入后序序列&#xff0c;用空格分隔。 第三行中输入中序序列&#xff0c;用空格分隔。 输出格…

Go 编程风格指南 - 最佳实践

Go 编程风格指南 - 最佳实践 原文&#xff1a;https://google.github.io/styleguide/go 概述 | 风格指南 | 风格决策 | 最佳实践 注意&#xff1a; 本文是 Google Go 风格 系列文档的一部分。本文档是 规范性(normative) 但不是强制规范(canonical)&#xff0c;并且从属于Goo…

C# type.GetProperty使用 Type.GetProperties() 获取不到值的解决方法

C# type.GetProperty使用 Type.GetProperty 方法用于获取当前 Type 的指定属性。它接受一个字符串参数&#xff0c;该字符串是你要获取的属性的名称。如果找到了匹配的属性&#xff0c;它会返回一个 PropertyInfo 对象&#xff1b;如果没有找到&#xff0c;它会返回 null。 下…

进入mysql报错:bash:/bin/mysql:没有那个文件或目录

问题分析&#xff1a; 有可能把/bin下面的mysql文件删除 解决方案&#xff1a; 卸载已安装MySQL&#xff0c;重新安装一遍 卸载步骤&#xff1a; 在CentOS系统中卸载MySQL可以通过以下步骤进行&#xff1a; 1、停止MySQL服务&#xff1a; sudo systemctl stop mysqld 2…

【GD32F303红枫派使用手册】第七节 TIMER-蜂鸣器PWM

7.1 实验内容 通过本实验主要学习以下内容&#xff1a; PWM输出功能实现&#xff1b; 定时器基本原理&#xff1b; 蜂鸣器驱动原理&#xff1b; 7.2 实验原理 7.2.1 蜂鸣器驱动原理 蜂鸣器是一种一体化结构的电子讯响器&#xff0c;采用直流电压供电&#xff0c;广泛应用…

数仓建模—指标体系初识

文章目录 数仓建模—指标体系初识什么是指标如何理解指标体系指标体系的价值指标体系的构建构建原则与规范指标体系的分类指标体系构建步骤指标体系挑战与对策总结数仓建模—指标体系初识 指标体系是一套系统化、结构化的指标集合,用于衡量、评估、监控组织或项目的整体情况。…

2024年信息素养大赛图形化编程小低组复赛模拟真题

2024年全国青少年信息素养大赛复赛为六道编程题&#xff0c;分值为10分*215分*225分*2&#xff0c;难度依次递增&#xff0c;按步骤评分&#xff0c;据Scratch实验室预估&#xff0c;初赛80%的晋级率&#xff0c;初赛近20万人&#xff0c;意味着有15万多进入复赛&#xff0c;7月…

bootstrapblazor小白笔记

使用了bootstrapblazor&#xff0c;采用.net8.0&#xff0c;server模式&#xff0c;所有的问题都是基于以上条件所遇到的 1、登录过后需要在每个页面都使用认证吗 是不需要的&#xff0c;每个页面都写attribute [Authorize]没有问题&#xff0c;但是页面很多的话一个一个的写很…

私有化部署的无忧企业文档,助力企业实现文档权限的精细化管理

在当今数字化快速发展的时代&#xff0c;企业文档管理已成为企业运营中不可或缺的一部分。文档的安全性和访问权限的精确控制对于企业的信息保护至关重要。在无忧企业文档管理系统中&#xff0c;不仅具备强大的内容管理能力&#xff0c;更在权限管理上做到了细致入微。下面我对…

C++ 宏定义中的##

一、解释 C的宏定义中的##&#xff0c;代表将内容先分隔&#xff0c;再强制连接。 二、举例 假设有如下宏定义&#xff1a; #define DECLARE(name, type) type name##_##type##_typevoid decl() {DECLARE(val, int); //语句1 } 则语句1替换为&#xff1a;int val_int_type 由…

【MySQL】MySQL Connect -- 详解

一、Connector / C 使用 要使用 C 语言连接 MySQL&#xff0c;需要使用 MySQL 官网提供的库&#xff0c;可以去官网进行下载&#xff1a;MySQL :: MySQL Community Downloads 我们使用 C 接口库来进行连接&#xff0c;要正确使用&#xff0c;还需要做一些准备工作&#xff1a…

[Windows] 植物大战僵尸杂交版

游戏包含冒险模式、挑战模式、生存模式三种不同玩法。冒险模式主打关卡闯关&#xff0c;挑战模式则挑战特殊设计的关卡&#xff0c;生存模式结合无尽模式和特殊地图&#xff0c;各具特色。玩家可根据喜好自由选择模式&#xff0c;体验不同的游戏乐趣。快来尝试这款独特的pvz游戏…

【2024-06-03】某红书X-s分析

声明:该专栏涉及的所有案例均为学习使用,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!如有侵权,请私信联系本人删帖! 文章目录 一、前言二、【2023-02-24】版本1.网站分析2.参数x-s3.web_session4.测试三、【2024-06-03】 版本1. 抓包流程2.简单分析…

springboot学习笔记-待整理

学习方式&#xff1a;看博客学习&#xff0c;记录博客链接&#xff0c;并整理干货知识点。 参考的博客&#xff1a;SpringBoot框架 Spring Boot最主要作用是帮我们快速的构建庞大的spring项目&#xff0c;并且尽可能的减少一切xml配置&#xff0c;做到开箱即用&#xff0c;迅…

对GPT-4o的评价:技术革新与未来展望

目录 引言一、GPT-4o的技术背景1.1 GPT系列的发展历程1.2 GPT-4o的技术特点 二、版本间的对比分析2.1 GPT-3与GPT-4的对比2.2 GPT-4与GPT-4o的对比 三、GPT-4o的技术能力3.1 自然语言处理3.2 多模态处理3.3 任务定制化 四、个人整体感受4.1 交互体验4.2 应用场景4.3 未来展望 五…

C++_deque:deque的数据结构特点

文章目录 &#x1f680;1. deque介绍&#x1f680;2. deque数据结构&#x1f680;3. deque的缺陷&#x1f680;4.为什么选择deque作为stack和queue的底层默认容器&#x1f680;5.deque头插逻辑&#xff08;了解&#xff09; 大家好&#xff01;本文会简单讲讲deque的使用与数据…

会计事务所巨头普华永道,大量内部文件泄露

据安全机构监测显示&#xff0c;“四大”会计师事务所之一的普华永道&#xff08;PwC&#xff09;遭遇数据泄露&#xff0c;18900份内部档案被公开&#xff0c;文件大小共222GB。泄露的文件包括客户评审文件、人力资源文件和员工文件。 据了解&#xff0c; 普华永道&#xff0…