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

刚刚接触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 条评论
登录 后参与评论

相关文章

来自专栏xdecode

ASpectJ对AOP的实现

切入点表达式 ? ? 基于注解 1 @Aspect // 表示当前类切面 2 public class MyAspect { 3 4 @Bef...

1776
来自专栏程序你好

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

712
来自专栏菩提树下的杨过

spring中的多线程aop方法拦截

日常开发中,常用spring的aop机制来拦截方法,记点日志、执行结果、方法执行时间啥的,很是方便,比如下面这样:(以spring-boot项目为例)

1012
来自专栏Java大联盟

Spring Data MongoDB:Repository

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

1331
来自专栏数据结构与算法

洛谷P1456 Monkey King

题目描述 Once in a forest, there lived N aggressive monkeys. At the beginning, they ...

2674
来自专栏lgp20151222

Spring AOP的增强处理

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

721
来自专栏xdecode

Spring之AOP

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

19410
来自专栏恰同学骚年

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

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

902
来自专栏更流畅、简洁的软件开发方式

我的数据访问函数库的源代码(四)—— 存储过程部分,包括存储过程的参数的封装

/* 2008 4 25 更新 */ 我的数据访问函数库的源码。整个类有1400行,原先就是分开来写的,现在更新后还是分开来发一下吧。 第四部分:存储过程部...

1847
来自专栏Jimoer

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

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

1162

扫码关注云+社区