恶补C++ 之 自增、自减操作符前缀式与后缀式的区别

相信很多人刚开始学习编程的时候,也是为这个问题烦恼过吧,前缀式与后缀式,在很久之前,式没有办法区别++和--操作符的前缀和后缀的调用的。不过在C++已经得到了扩展。

然而无论式前缀或者后缀,都只有一个参数。为了解决这个问题,C++规定后缀形式有一个int类型的参数,当函数被调用的时候,编译器传递一个0作为int参数给该函数:

class UPInt {

public:

UPInt& operator++();        // ++前缀

const UPInt operator++(int);    // ++后缀

UPInt& operator--();        // --前缀

const UPInt operator--(int);    // --后缀

.......

}

UPInt i;

++i;        // 调用  i.operator++();

i++;        // 调用  i.operator++(0);

--i;          // 调用  i.operator--();

i--;          // 调用  i.operator--(0);

需要注意的是,这些操作符前缀与后缀形式的返回值类型是不同的。前缀形式中返回一个引用,后缀形式返回一个const类型。

区分前缀与后缀其实也很简单,只需要记住一句话:increment的前缀形式叫做“增加然后取值”,后缀形式叫做“取回然后增加”。

// 前缀形式

UPInt& UPInt::operator++() {

*this += 1;        // 增加

return *this;    // 取回值

}

// 后缀形式

const UPInt UPInt::operator++(int) {

UPInt oldValue = *this;    // 取回值

++(*this);                           // 增加

return oldValue;                 // 返回被取回的值

}

后缀操作符函数没有使用它的函数,它的参数只是用来区分前缀与后缀函数的调用。如果你很关心效率问题,你可能已经发现,后缀操作符函数必须建立一个临时对象做为它的返回值。这个临时对象必须被构造并在结束是析构。而前缀操作符则没有这样的临时对象。则可以得出结论:如果仅为提高效率,则尽可能使用前缀操作符,少用后缀操作符,除非必须使用后缀操作符。

正如你所看到的,掌握前缀和后缀的increment和decrement是容易的。一旦了解了它们的正确返回值类型以及后缀操作符应该以前缀操作符为基础来实现的规则,就足够了。

时间: 2024-10-14 17:27:02

恶补C++ 之 自增、自减操作符前缀式与后缀式的区别的相关文章

C++ Primer 学习笔记_61_重载操作符与转换 --自增/自减操作符

重载操作符与转换 --自增/自减操作符 引言: 自增,自减操作符常常由诸如迭代器这种类实现,这种类提供相似于指针的行为来訪问序列中的元素.比如,能够定义一个类,该类指向一个数组并为该数组中的元素提供訪问检查: class CheckedPtr { public: //这个类没有默认构造函数,必须提供指向数组的指针. /**构造函数的參数是两个指针:一个指向数组的開始,还有一个指向数组的末端. *构造函数用这两个指针初始化 beg 和 end *并将 curr 初始化为指向第一个元素 */ Che

C# 中重载自增自减操作符的具体运算原理 ----从C++程序员的角度看C#自增操作符重载的实质

看了看C#的运算符重载,发现与C++打不相同.刚刚被C#的自增操作符坑了,现在来分享一下. 先定义一个类 class A { public int i; public A(int I) { i = I; }public static A operator ++(A a) { return new A(100); } } 主函数 class Program { static void Main(string[] args) { A v = new A(10); Console.WriteLine(

python自增自减?赋值语句返回值?逗号表达式?

咳咳,直接进入正题吧. 自增自减(++/--),以及赋值语句,还有逗号表达式都是在C/C++中常见的运算符或表达式. 熟悉C/C++的小伙伴们都知道,在C/C++中: 自增自减(前缀/后缀)运算符将实现对变量值的 加1/减1:  类似 x = 0; ++x;的语句会使最终 x 的值为1 赋值语句将所赋的值作为该语句的返回值(值传递):  类似 (x = func()) > 0; 的语句会将函数 func()的返回值赋给 变量x ,并继续执行 x > 0的条件判断语句,这样的语句在C/C++中显

运算符重载之自增自减篇

       今天写题要求写到重载自增自减运算符,之前看运算符的重载没有仔细思考,对于运算符++和--来说有两种形式,一种是前置的形式,一种是后置的形式.        如果不区分前置或者后置的区别的话,则我们就像其他运算符那样直接operator++()或者operator--()去重载就可以,但是如果我们要区分前置和后置,那么这种重载方式不能代替两种形式,所以在这里说明一下,我们用operator++()和operator--()重载前置运算符,用operator++(int)和operat

恶补Java(十三)之Java IO-----File类的用法

恶补Java---JavaI/O部分之File类的用法(笔记) 在java中,I/O(输入/输出)是比较乏味的事情,因为看不到明显的运行效果,但输入/输出是所有程序都必需的部分--使用输入机制,允许程序读取外部数据(包括来自磁盘.光盘等存储设备的数据).用户输入数据:使用输出机制,允许程序记录运行状态,将程序数据输出到磁盘.光盘等存储设备中. Java的I/O通过java.io包下的类和接口来支持,在java.io包下主要包括输入.输出两种IO流,每种输入.输出流又可分为字节流和字符流两大类.其

[转]C语言中自增自减运算符教学探究-中国论文网

摘要:C语言教学中,自增自减运算符运用得非常广泛,且具有一定的使用技巧和难度.在诸多运算符中,自增自减运算符是学生最难理解和最易出错的运算符.对自增自减运算符的功能和具体应用进行探究,以期为提高C语言教学效果提供帮助.中国论文网 http://www.xzbu.com/8/view-3865031.htm 关键词:C语言:自增自减运算符:教学效果 中图分类号:G434文献标识码:A文章编号:1672-7800(2012)012-0188-02 0引言 C语言编程设计中,若合理使用自增自减运算符,

前置后置自增自减操作

class Int { friend ostream& operator<<(ostream& os, const Int& i); friend istream& operator>>(istream& is, Int& i); friend bool operator<(const Int& a, const Int& b); private: int value; public: Int():value(0

自增/自减运算符

因为做以下题有感...原来简单的自增运算符也有这么多猫腻 http://blog.csdn.net/zdarks/article/details/8767087 第五题  参考:c程序设计语言2.8章   Vs2015测试: a[6]={0};t=h=0; a[0]=a[0]++ 1 a[1]=++a[1] 1 a[2]=t++ 0 a[3]=++h 1 COUT<<a[4]++ 0 COUT<<++a[5] 1 自增自减只能作用于变量,不能作用于表达式 在不需要使用任何具体值且仅

自增自减运算法的深入理解

例二: int i=3;  int j=4;  int a = i++ + i++;  int b = ++j + ++j;  printf("%d, %d\n", a, b); 问题又来了,i++ + i++是先自增一次,相加,再自增,然后赋值呢,还是先相加赋值然后自增两次呢.另外,++j又将如何表现呢? 结果是:6,12 这下明白了,原来 i++的理解应该是执行完整个表达式的其他操作后,然后才自增,所以例子中的a=3+3=6:而后i再自增2次,i=5:相反,++j是先自增然后再参加