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

【More Effective C++】Item 6相关推荐

  1. 【More Effective C#】Lambda表达式优化

    [More Effective C#]Lambda表达式优化 2010-10-19 08:09 by 空逸云, 2923 阅读, 38 评论, 收藏, 编辑 使用Lambda表达式将会造成Lambda ...

  2. 【读书笔记】【More Effective C++】技术(Techniques,Idioms,Patterns)

    条款 25:将 constructor 和 non-member functions 虚化 [本条款的多个实现都比较相似:写一个虚函数做实际工作,再一个非虚函数调用该虚函数] 原则上构造函数不能为虚: ...

  3. 【读书笔记】【More Effective C++】异常(Exceptions)

    条款 9:利用 destructors 避免泄露资源 问题的提出:使用指针时,如果在 delete 指针之前产生异常,将会导致不能删除指针,从而产生资源泄漏.[无法释放 heap 中数据] class ...

  4. 《随笔二十六》—— “ 【More Effective C++】 提炼总结一 ”

    目录 惯例与术语 第一章  基础议题 Item M1:指针与引用的区别 Item M2:尽量使用C++风格的类型转换 Item M3:Never treat arrays polymorphicall ...

  5. 【读薄Effective Java】创建和销毁对象

    1. 考虑用静态工厂方法代替构造器 1.1 静态工厂的优点 静态工厂就是通过静态方法来代替构造器.相比构造函数,它有几个优势. 构造器没有名称.而静态工厂能指定名称,当一个类有多组构造函数的时候,可以 ...

  6. 【More Effective C#】LINQ表达式与方法调用的映射

    LINQ构建在两个概念之上,一种查询语言和一系列将查询语言转换成方法调用的实现.在编译时,编译器将LINQ表达式(LINQ to object)转换成方法调用. .Net基础类库提供了两种扩展方法.S ...

  7. 【读书笔记】【Effective STL】容器

    第 1 条:慎重选择容器类型. C++ 中不同的容器分类如下:[标准 or 非标准][STL or 非 STL][序列 or 关联] 标准 STL 序列容器:vector.string.deque.l ...

  8. 【最新重磅整理】82篇AAAI2021强化学习领域论文接收列表

    深度强化学习实验室 官网:http://www.neurondance.com/ 论坛:http://deeprl.neurondance.com/ 作者:深度强化学习实验室&AMiner 编 ...

  9. 【文章翻译+笔记】Towards the Next Generation of Recommender Systems:A Survey of the State-of-the-Art and Pos

    Towards the Next Generation of Recommender Systems:A Survey of the State-of-the-Art and Possible Ext ...

最新文章

  1. Solr索引数据同步ReplicationHandler
  2. intellij idea 生成可执行jar 运行提示没有主清单属性
  3. ASP.NET froms 身份验证之Roles
  4. SQL Server 2005架构
  5. python:软件目录结构规范
  6. linux创建指定大小的文件
  7. zap安装提示java_使用API调用进行ZAP身份验证
  8. idea下以及git如何快速切换remote远端服务器
  9. 网站icon收藏夹图标
  10. shmget出现Invalid argument错误
  11. layui表单元素的radio单选框问题
  12. 矩阵求导、几种重要的矩阵及常用的矩阵求导公式
  13. 建筑智能化集成系统及架构简介
  14. ZXing设置前置摄像头扫描
  15. “扣哒杯” AI世青赛全国决赛落幕 集体奖和一等奖附加赛名单揭晓
  16. 020_linux驱动之_输入子系统按键应用
  17. android 耳机数据传输,智能手机耳机电路工作原理
  18. 应用计算机怎么弹ink,ink是什么文件,手把手教你怎么打开ink文件
  19. Gabor滤波器 pytorch实现
  20. 软件测试--如何把5M图片变成10M图片

热门文章

  1. python fieldnames_csvreader.fieldnames在python中未被识别为csv reader对象的属性
  2. isc dhcp_ISC的完整形式是什么?
  3. 在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误。未找到或无法访问服务器。请验证实例名称是否正确并且 SQL Server 已配置为允许远程连接。 (provider: 命名管
  4. FreeRTOS队列
  5. phpstud如何安装mysql新版_MySQL_图解MySQL数据库的安装和操作,一、MySQL下载与安装 1、 - phpStudy...
  6. rocksdb原理_教你玩转MyRocks/RocksDB—STATISTICS与后台线程篇
  7. linux中updatedb命令详解,updatedb命令
  8. uva 11572 ——Unique Snowflakes
  9. 在windows上使用go编译dll文件,供C++调用
  10. Linux gcc 制作静态库01