【编程基础】前置++和后置++详解

刚刚接触C++的新手同学们,往往会被前置++和后置++搞混。这个概念在C++中还是很重要的,把前置++和后置++弄明白是必须的。下面就给大家介绍前置++和后置++的区别。

前置++:

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::peartor ++ (Int) // 后置的有一个匿名参数,并且返回const值 { CInt old = * this ; ++ ( * this ); return old; }

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

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

前置仅仅是对自身进行运算,并将自身返回,这样外面可以直接对这个返回对象再进行操作 ,如

(++it)->function()

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

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

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

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

希望通过以上内容的介绍,能够帮助到你。


原文发布于微信公众号 - 程序员互动联盟(coder_online)

原文发表时间:2015-07-08

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Zephery

2017-03-02学习笔记

知识点 一、static public class Spike { public static void main(String[] args) ...

36910
来自专栏一个会写诗的程序员的博客

Kotlin 中的集合类排序Kotlin 开发者社区

Kotlin使用扩展方法构建在Java Collection框架之上。这大大提高了可用性和可读性,而无需第三方依赖,如Apache Commons或Guava。

1345
来自专栏程序你好

C# 发展历史及版本新功能介绍

792
来自专栏xdecode

Spring之AOP

之前在另外一篇博文里介绍过AOP的概念, 这边不在赘述, 可以参考 AOP与动态代理 本文主要介绍Spring中AOP的应用. 切入点: 具体实现类的方法 ...

20110
来自专栏Jimoer

在Java的反射中,Class.forName和ClassLoader的区别

最近在面试过程中有被问到,在Java反射中Class.forName()加载类和使用ClassLoader加载类的区别。当时没有想出来后来自己研究了一下就写下来...

1292
来自专栏恰同学骚年

.NET基础拾遗(1)类型语法基础和内存管理基础

在.NET中所有的内建类型都继承自System.Object类型。在C#中,不需要显示地定义类型继承自System.Object,编译器将自动地自动地为类型添...

1042
来自专栏Java大联盟

Spring Data MongoDB:Repository

使用Spring Data可以帮助我们快速构建项目,非常方便,Spring Data在数据持久层已经写好了常用功能,我们只需要定义一个接口去继承Spring D...

1721
来自专栏CDA数据分析师

Python3 大作战之 encode 与 decode 讲解

原文链接http://blog.csdn.net/qq_29053519/article/details/79170519 大家好,很久没更新了,也是年底了最近...

2625
来自专栏开发与安全

算法:静态查找表(Static Search Table)(顺序查找、二分查找、插值查找、斐波纳契查找)

查找表(Search table)是由同一类型的数据元素(或记录)构成的集合。关键字(key)是数据元素中某个数据项的值,又称为键值,用它可以表示一个数据元素,...

2275
来自专栏lgp20151222

Spring AOP的增强处理

就是@Before @Around @AfterReturning @AfterThrowing这几个标签的属性可以放到方法参数里面获取

771

扫码关注云+社区