More Effective C++ (条款21:利用重载技术避免隐式类型转换)_more effective c++21-程序员宅基地

技术标签: c++  利用重载技术避免隐式类型转换  More Effective C 条款21  

1. 正如条款19和条款20所言,临时对象的构造和析构会增加程序的运行成本,因此有必要采取措施尽量避免临时对象的产生.条款20介绍了一种用于消除函数返回对象而产生临时对象的方法——RVO,但它并不能解决隐式类型转换所产生的临时对象成本问题.在某些情况下,可以考虑利用重载技术避免隐式类型转换.

2. 考虑以下类UPInt类用于处理高精度整数:

class UPInt{
public:
    UPInt();
    UPInt(int value);
    ...
};
const UPInt operator+(const UPInt& lhs,const UPInt& rhs);

operator+返回const对象原因:

Rational a,b,c;

...

(a*b)=c;//在a*b的成果上调用operator=

if(a*b=c)//其实是想做一个比较,若a和b都是内置类型,这样是不合法的代码;“一个良好的用户自定义类型”的特征是它们避免无端地与内置类型不兼容,因此对两值乘积赋值没什么意思。将operator*返回值声明为const可避免这样没意思的赋值

    那么以下语句可以通过编译:

UPInt upi1;
...
UPInt  upi2=2+upi1;
upi3=upi1+2;

    原因在于UPInt的单int参数构造函数提供了一种int类型隐式转换为UPInt类型的方法:先调用UPInt的单int参数构造函数创建一临时UPInt对象,再调用operator+.此过程产生了一临时对象,用于调用operator+并将两个UPInt对象相加,但实际上要使int与UPInt相加,不需要隐式类型转换,换句话说,隐式类型转换只是手段,而不是目的.要避免隐式类型转换带来的临时对象成本,可以对operator+进行重载:(每个重载操作符至少获得一个“用户定制类型”的自变量,故没有UPInt operator+(int,int))

UPInt operator+(int,const UPInt&);
UPInt operator+(const UPInt&,int);

3. 2中用函数重载取代隐式类型转换的策略不局限于操作符函数,在string与char*,Complex(复数)与int,double等的兼容方面同样可以采用此策略,但此策略要权衡使用,因为在增加一大堆重载函数不见得是件好事,除非它确实可以使程序效率得到大幅度提高.

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_22238021/article/details/79559125

智能推荐

从微信扔骰子看iOS应用安全与逆向分析_frida lldb函数偏移-程序员宅基地

文章浏览阅读1.1k次。以微信扔骰子小游戏为例,记录一次完整 iOS 逆向分析的过程。_frida lldb函数偏移

URL的编码和解码_o的url编码-程序员宅基地

文章浏览阅读1.3k次。万分感谢原文作者:何必等明天原文出处:http://www.cnblogs.com/xzwblog/1 为什么要URL编码在因特网上传送URL,只能采用ASCII字符集也就是说URL只能使用英文字母、阿拉伯数字和某些标点符号,不能使用其他文字和符号,即只有字母和数字[0-9a-zA-Z]、一些特殊符号$-_.+!*'()[不包括双引号]、以及某些保留字(空格转换为+),才可以不经过..._o的url编码

Java实现微信小程序发送订阅消息-程序员宅基地

文章浏览阅读732次。一、创建订阅消息模板 1.登入微信公众平台:https://mp.weixin.qq.com/ 2.创建消息模板勾选右侧需要的关键字 二、代码实现1.小程序代码 错误:errcode":43101 需要小程序允许接收通知才行,允许一次可发送一次,允许可叠加//tmplIds模板id(一次订阅可能有多个id','隔开)wx.requestSubscribe...

SpringMVC 四大组件-程序员宅基地

文章浏览阅读1.6k次,点赞2次,收藏4次。核心组件:(SpringMVC 四大组件)DispatchServlet: 前端控制器 Servlet分发器,整个SPringMVC框架入口 用户请求到达前端控制器,它就相当于mvc模式中的c,dispatcherServlet是整个流程控制的中心, 由它调用其它组件处理用户的请求,dispatcherServlet的存在降低了组件之间的耦合性 HandlerMapp...

利用Vulnhub复现漏洞 - Drupal Drupalgeddon 2 远程代码执行漏洞(CVE-2018-7600)_vulhub漏洞复现 cve-2018-7600-程序员宅基地

文章浏览阅读2.5k次。Drupal Drupalgeddon 2 远程代码执行漏洞(CVE-2018-7600)Vulnhub官方复现教程漏洞原理复现漏洞启动环境漏洞复现Vulnhub官方复现教程https://github.com/vulhub/vulhub/blob/master/drupal/CVE-2018-7600/README.zh-cn.md漏洞原理Drupal 是一款用量庞大的CMS,其6/7/..._vulhub漏洞复现 cve-2018-7600

Android开源项目_android jazz服务-程序员宅基地

文章浏览阅读474次。大家空闲的时候可以学习下,一些项目还是经常能用到的。1. 对图片的剪裁cropimage-masterhttp://stackoverflow.com/questions/18013406/is-com-android-camera-action-crop-not-available-for-android-jelly-bean-4-32. ImageLoader _android jazz服务

随便推点

【VUE】vue配置Gzip压缩-程序员宅基地

文章浏览阅读2.6k次。安装compression-webpack-pluginnpm install compression-webpack-plugin --save-devvue.config.js配置Gzip压缩// 导入compression-webpack-pluginconst CompressionWebpackPlugin = require('compression-webpack-plug..._vue配置gzip

台式计算机电源安装在哪里,如何样查看台式机电源配置-程序员宅基地

文章浏览阅读3.1k次。有时候想查看下自己台式机电源的具体配置,有什么方法查看呢?下面是小编收集整理的,希望对大家有帮助~~样查看台式机电源配置查看台式机电源配置方法一:1、可以根据电源的品牌型号,网上或者电商平台查询一下产品,然后看电源参数,就可以知道了是多大功率的了。2、若是使用中的电源,直接拆开机箱查看也可以,电源上都是有功率标注的。查看台式机电源配置方法二:一,在桌面上右击我的电脑,在弹出的菜单中选择属性。二,在..._台式电脑怎么查看电源参数

Datasets for Data Mining and Data Science-程序员宅基地

文章浏览阅读131次。https://github.com/mattbane/RecommenderSystemhttp://grouplens.org/datasets/movielens/KDDCUP-2012官网From kdnuggetsData repositoriesAWS (Amazon Web Services) Public Data Sets, provides a ..._msc data science for cultural heritage

蓝鲸自动化运维平台_腾讯 gse-程序员宅基地

文章浏览阅读9.3k次,点赞6次,收藏32次。蓝鲸自动化运维平台1.蓝鲸简介官网:https://bk.tencent.com/docs/腾讯蓝鲸智云,简称蓝鲸,是腾讯互动娱乐事业群(Interactive Entertainment Group,简称 IEG)自研自用的一套用于构建企业研发运营一体化体系的 PaaS 开发框架,提供了 aPaaS(DevOps 流水线、运行环境托管、前后台框架)和 iPaaS(持续集成、CMDB、作业平台、容器管理、数据平台、AI 等原子平台)等模块,帮助企业技术人员快速构建基础运营 PaaS。2.蓝鲸部署2_腾讯 gse

STM32HAL库电机开发-位置环和电流环-位置式PID-有刷减速电机_stm32电流环-程序员宅基地

文章浏览阅读2.8k次。PID讲一下pid算法先。基本pid算法有两种位置式和增量式,下面两张图片分别是位置式和增量式,各有优缺点,自行百度后选择,本实验采用位置式,当你想换一个的时候改一下pid.c里面的算式就行。为了提高控制精度,我们可以采用多环控制,或者与其他控制算法相结合,一般多环控制是三环,最内层是电流环,其次是速度环,最外层是位置环。位置环的意思有两个,一个是你想要电机转动的圈数位置,另外你可以根据实际应用进行反馈,例如做真空泵的就根据实际测量的真空度作为位置环来控制精度。多环控制:与其他算法结合:_stm32电流环

SpringCloud(Finchley)整合sleuth、zipkin、kafka、es_spring cloud sleuth kafka-程序员宅基地

文章浏览阅读4k次。SpringCloud(Finchley)整合sleuth、zipkin、kafka、es由于springcloud的Finchley版本发布以及springboot2.x的版本更新,很多配置都与以前大相径庭,最近需要使用目前最新的版本做一套springcloud的链路追踪功能,到处寻觅配置你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编..._spring cloud sleuth kafka

推荐文章

热门文章

相关标签