当前位置: 首页 > news >正文

前++和后++的实现

前置++:type operator++();

后置++:const type operator++(int );

为了编译器区分前置和后置++,C++规定后缀形式有一个int类型参数 ,当函数被调用时,编译器传递一个0做为int参数的值给该函数。不这样规定,无法区分,因为都仅以自身对象为入参。

下面是一个简单的例子:

class CInt {
private :
int m_value;
//
} ;
CInt & CInt:: operator ++ ( ) // 前置的是没有参数的,并且返回引用
{
this -> m_value += 1 ;
return * this ;
}
const CInt CInt::opeartor ++ (Int) // 后置的有一个匿名参数,并且返回const值
{
CInt old = * this ;
++ ( * this );
return old;
}

上面的实现解释了一个关键问题:前置比后置效率高 ,后置需要构造临时对象并返回。

那为什么前置和后置返回参数不同呢?

前置仅仅是对自身进行运算,并将自身返回,这样外面可以直接对这个返回对象再进行操作 ,如(++it)->function()。

后置因其返回的不是原来的对象,此时再进行额外操作,改变的是临时对象的状态,并不异义 ,容易误解。

那为什么不返回const &呢?因为不能这么做,返回引用将无效,临时对象已经不存在了。

所以后置返回const 对象即限制对此临时对象进行误操作,并显式地告诉调用者此对象仅为原对象的副本。

另外还有一个原因:内置int类型并不支持 i++++ .而如果后置++返回一个可修改的副本将与内置int类型行为不同。故应该禁止使用者对返回值进行修改。

相关文章:

  • 函数的调用规则(__cdecl,__stdcall,__fastcall,__pascal)
  • __declspec关键字详细用法
  • 关于C#间接继承的一些思考:如何修改继承函数的返回值类型
  • 谈谈小弟最近暗自干些什么勾当(LGame WP版开发进度汇报)
  • VC++多线程编程
  • 恐怖绝伦,SOPA和PIPA捅了网站窝!
  • 过年收拾旧货,散点Java游戏源码
  • 面向概念编程浅谈:最大限度的UI代码共用
  • C#实现字符串相似度比较[Levenshtein Distance算法]
  • windows下编译boost库
  • 创建和使用动态链接库
  • boost.python的基本使用方法
  • swig+python的用法
  • Lua For Windows 环境配置及使sciTE支持中文
  • 获取Libgdx源码和demos
  • 【Leetcode】101. 对称二叉树
  • 【翻译】Mashape是如何管理15000个API和微服务的(三)
  • 【腾讯Bugly干货分享】从0到1打造直播 App
  • HTTP那些事
  • Java比较器对数组,集合排序
  • Java方法详解
  • Java知识点总结(JDBC-连接步骤及CRUD)
  • js写一个简单的选项卡
  • Laravel Telescope:优雅的应用调试工具
  • miniui datagrid 的客户端分页解决方案 - CS结合
  • 对超线程几个不同角度的解释
  • 前端每日实战:61# 视频演示如何用纯 CSS 创作一只咖啡壶
  • 前端自动化解决方案
  • 浅谈Kotlin实战篇之自定义View图片圆角简单应用(一)
  • Semaphore
  • 积累各种好的链接
  • ​总结MySQL 的一些知识点:MySQL 选择数据库​
  • # 数据结构
  • (k8s中)docker netty OOM问题记录
  • (办公)springboot配置aop处理请求.
  • (附源码)spring boot校园健康监测管理系统 毕业设计 151047
  • (六) ES6 新特性 —— 迭代器(iterator)
  • (每日持续更新)jdk api之FileReader基础、应用、实战
  • (三)终结任务
  • (一)80c52学习之旅-起始篇
  • (已解决)vue+element-ui实现个人中心,仿照原神
  • (转)Mysql的优化设置
  • ./和../以及/和~之间的区别
  • .FileZilla的使用和主动模式被动模式介绍
  • .NET 命令行参数包含应用程序路径吗?
  • .NET/C# 使用 ConditionalWeakTable 附加字段(CLR 版本的附加属性,也可用用来当作弱引用字典 WeakDictionary)
  • .Net6支持的操作系统版本(.net8已来,你还在用.netframework4.5吗)
  • .Net的DataSet直接与SQL2005交互
  • .net网站发布-允许更新此预编译站点
  • .NET项目中存在多个web.config文件时的加载顺序
  • :not(:first-child)和:not(:last-child)的用法
  • @DependsOn:解析 Spring 中的依赖关系之艺术
  • @Import注解详解
  • @RequestParam @RequestBody @PathVariable 等参数绑定注解详解
  • [ 云计算 | AWS 实践 ] 基于 Amazon S3 协议搭建个人云存储服务