【More Effective C++】Item 6

Item 6:区别Increment和Decrement操作符的前置(prefix)和后置(postfix)形式


  前置和后置的区别主要在于函数参数不一样,后置形式中多了一个int型的参数,在后置形式被调用时,编译器会自动给该int型参数传0值。其次在于前置和后置形式所返回的类型不同,前置返回一个引用,后置返回一个const对象。
  下面主要讲解increment的前置和后置形式,decrement类似。
  //前置式:累加后取出(increment and fetch)
  UPInt& UPInt::operator++() //     1
  {

    (*this)+=1;

    return *this;

  }
  const UPInt UPInt::operator++(int)     // 2-3
  {

    UPInt oldValue=*this; 

    ++(*this);         // 4

    renturn oldValue;

   } 
  首先,请看上面4处标红的地方,这些都是我们需要特别注意的地方。
  1、前置返回的是引用 (&) 类型;
  2、后置返回的是 const 对象;之所以是const类型,是根据内置类型(int等)的++、--的规则来要求的。对于内置类型 i++++ 是不允许的(但是 ++++i 是允许的)所以我们为自定义类型重载的 ++、-- 也应该符合这个规则。如果我们不定义返回值类型为const,那么 i++++就可以转化为 i.operator++(0) .operator(0); 得以合法执行,这是错误的。原因主要有两点a)不符合内置类型的规则;b)计算结果错误,因为第二个后置式操作没有改变真正的对象的值,而是改变的返回对象的值。因此最好的办法就是禁止非const返回类型合法化。
  3、后置有一个int型的参数,但是在函数体内并没有动用其参数,是的,以为该int型参数的唯一目的只是为了区别前置式和后置式。但是,如果你在函数体内没有使用函数的命名参数,许多编译器都会给出警告,因此为了避免这类警告,一种常见的策略是:故意略去你不打算使用的参数的名称,以上代码就是实行的这个策略。
  4、这个是为了保证后置式和前置式的行为一致,才这样做的。这个保证原则是:后置式increment和decrement操纵符的实现应以其前置式的兄弟为基础。如此一来,你只要维护前置式,因为后置式会自动调整为一致的行为。

  从效率方面来看:推荐大家尽量使用前置式(prefix),而不是后置式(postfix)
  因为后置式有临时对象的构造和析构,尤其对于自定义类型,造成的影响更大。

转载于:https://www.cnblogs.com/next-IT-direction/p/3599947.html

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

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

相关文章

WordPress 多语言支持(本地化)

https://www.cnblogs.com/ryanzheng/p/8309261.html WordPress 多语言支持(本地化) 本博客将介绍WordPress的多语言制作 首先需要在wp-content目录下创建一个languages文件夹,用于存放语言包文件。 然后在模板目录下的functions.php&…

timestamp与timedelta,管理信息系统概念与基础

将字符串‘2017年10月9日星期一9时10分0秒 UTC8:00’转换为timestamp。100天前是几号?今年还有多少天?管理有不同层次所需信息各有什么特点?管理信息系统从层次上可分为哪几类?数据处理经历了哪些阶段?各有什么特点?什么是web&a…

ZooKeeper1 利用虚拟机搭建自己的ZooKeeper集群

前言: 前段时间自己参考网上的文章,梳理了一下基于分布式环境部署的业务系统在解决数据一致性问题上的方案,其中有一个方案是使用ZooKeeper,加之在大数据处理中,ZooKeeper确实起到协调服务的作用,所以利用周末休息时间…

公共的Controler,是给非授权的用户访问

issue: 我使用的环境是Vs2012 , 创建了MVC4的工程&#xff0c;然后在工程里面Webconfig, 添加了访问限制 <authentication mode"Forms"> <forms loginUrl"~/Account/Login" timeout"2880" /> </authentication> <…

替换更改登陆页面logo与链接

//替换更改登陆页面logo与链接 function custom_loginlogo() {echo<style type"text/css"> h1 a {background-image: url(.get_bloginfo(template_directory)./logo.png) !important; } </style>;}add_action(login_head, custom_loginlogo); 注: 在主题…

es6关于let和const的总结

set用于声明变量 1.var 的一个升级版 2.不存在变量提升 console.log(a);//Uncaught ReferenceError: a is not definedlet a1;console.log(a);//1 console.log(a);//undefinedvar a1;console.log(a);//1 3.会形成暂时性死区&#xff08;处于同一个块级作用域里的同名变量在let声…

解决SublimeCodeIntel回车换行误打代码

SublimeCodeIntel会自动匹配并联想词汇, 这在换行的时候非常麻烦, 每次点Enter 都会误打出代码, 解决办法分两步:第一步是在Perferences/setting User 中加入 "auto_complete_commit_on_tab": true, 然后看Perferences/KeyBindings Default中 { "keys": [&…

【转】测试过程管理案例6---如何做项目的测试经理?

帖子地址&#xff1a; http://bbs.testage.net/viewthread.php?tid4588&pid184557&page1&extrapage%3D1#pid184557 案例描述&#xff1a; 简单叙述一下我遇到的问题吧&#xff1a; 公司其它部门有个项目&#xff0c;需要做很严格的测试&#xff0c;请求我们部门支…

Mysql 根据一个表数据更新另外一个表

https://www.cnblogs.com/wu628/p/4948833.html Mysql 根据一个表数据更新另外一个表 update 更新表 set 字段 (select 参考数据 from 参考表 where 参考表.id 更新表.id); update table_2 m set m.column (select column from table_1 mp where mp.id m.id); 方法二&a…

Html5响应式设计与实现广场

由于提出的想法响应式设计&#xff0c;越来越多的网站使用这样的思想。各类大型网站如雨后春笋般涌了出来。例如&#xff1a;小米商城。天猫等。 至于响应式设计的概念等大家能够去百度百度&#xff0c;我这里就不相信解说了。直接为大家带来源代码。用Html5实现响应式的九宫格…

工作问题日志

1. 获取用户请求的路径&#xff1a;HttpServletRequest request (HttpServletRequest) req;String servletPath request.getServletPath(); 2. 相对通用的读文件流的方法&#xff08;Windows 和 Linux上都可以用&#xff09;&#xff1a;拿到流&#xff0c;然后再去读流中的内…

wordpress 每段首行空两格

p {text-indent:2.1em;} 注&#xff1a; 在文章页&#xff0c;添加样式即可。

Java简单计算器

Java简单计算器转载于:https://www.cnblogs.com/wangprince2017/p/7654542.html

【j360-boot】Spring-boot系列三(崩溃模式,不是你崩就是电脑崩)

2019独角兽企业重金招聘Python工程师标准>>> j360-boot spring-boot入门工程之j360-boot&#xff1a;&#xff08;欢迎star、fork&#xff09; https://github.com/xuminwlt/j360-boot spring-boot官方地址 http://projects.spring.io/spring-boot/ 【j360-boot】Sp…

layui-弹出层中如何关闭窗口

https://blog.csdn.net/laiyuan999/article/details/80341756 var index layer.open(); layer.close(index); //此时你只需要把获得的index&#xff0c;轻轻地赋予layer.close即可

C++Objective-c

1.两种语言的指针和引用 C中引用和指针是两个不同的概念 Objective底层是用C实现的,其对象访问机制是C中的指针访问对象,所以如果直接访问Objective-C中的变量是需要用对象名->变量名 如果在OC中定义了property a这里生成的知识get和set方法,外界并不能直接访问a,因为a默认是…

裸眼3D全攻略3:拍摄3D—瞳距、镜距、视角偏转与空间感

http://sd89.blog.163.com/blog/static/356041322014112532958728/ 3D图片的拍摄&#xff0c;与平面有着全新的不同要求&#xff0c;那就是空间感的表现。 简单来说&#xff0c;空间感是由两条视线分别从左右不同的视角&#xff0c;各自获取物体左右两面的不同信息交汇而产生的…

【教学类-42-02】20231224 X-Y 之间加法题判断题2.0(按2:8比例抽取正确题和错误题)

作品展示&#xff1a; 0-5&#xff1a; 21题&#xff0c;正确21题&#xff0c;错误21题42题 。小于44格子&#xff0c;都写上&#xff0c;哪怕输入2:8&#xff0c;实际也是5:5 0-10 66题&#xff0c;正确66题&#xff0c;错误66题132题 大于44格子&#xff0c;正确66题抽取44*…

(原)用pixi.js 实现 方块阵点击后原地自转效果

源码 各位&#xff0c;请教一个问题&#xff0c;我这个还有BUG&#xff0c;我是想实现&#xff0c;点击一下可以 停止转动&#xff0c;然后再点一下重新转动。而不是一直加速&#xff0c;有没有什么好办法&#xff1f; PS:问题已经解决&#xff0c;谢谢评论的大神Antineutrino …

datatables 增、删、查、改

前提: datatable 定义 var table $(#example).DataTable({"ajax": "donor/book_donation_data.php",responsive: true,//data: data,columns: [{data: id},{data: donor},{data: book_name},{data: author},{data: publishing_time},{data: price},{data…