重载前置++运算符和后置++运算符

来源:互联网 发布:大禹装饰软件官方网站 编辑:程序博客网 时间:2024/06/05 05:42

运算符重载的主要目的是为了让用户自定义类型对象可以像普通数据类型一样能够进行加减乘除,自加自减等操作,非常直观方便。

在这里总结一下C++的++(分前置与后置)运算符的重载。自减运算符同理。关键就是如何通知编译器,让它知道哪个是前置版本,哪个是后置版本。

如何让编译器知道是前置还是后置呢?其实很简单,只要在重载操作符的形参中加上一个整数型参数,编译器就会自动将这个函数标示为后置,相应的不加则是前置。

(1)前置++运算符的重载方式:

成员函数的重载: 函数类型& operator++()

友元函数的重载:friend 函数类型& operator++(类类型& )

(2)后置++运算符的重载方式:

成员函数的重载:函数类型 operator++(int)

友元函数的重载:friend 函数类型 operator++(类类型&, int)


需要注意的一点是,后置++返回的是右值,所以返回类型不要再加&引用了。友元函数的重载和普通函数的重载是一样的。


下面我们来举几个例子。

1.枚举类型的前置++ 后置++

typedef enum {UP,DOWN,LEFT,RIGHT}Direction;//prefix ++Direction& operator++(Direction& dir){if(dir >= RIGHT)return dir;int temp = dir;dir = static_cast<Direction>(++temp);return dir;}//postfix ++Direction operator++(Direction& dir,int flag){if(dir >= RIGHT)return dir;Direction temp = dir;++dir;return temp;}

再来看最后一个例子,这个是与类有关的。注意,成员函数与友元函数的重载如果同时存在时,会先调用成员函数的重载,但是在++或--时,成员函数与友元函数的重载是不能同时存在的。下面这样写,在调用的地方会出现二义性错误的。这样写只不过是为了看着方便。

#ifndef INTEGER_HEAD_FILE#define INTEGER_HEAD_FILEclass Integer{public:    Integer(int n);    ~Integer();    Integer& operator++(); //member function prefix ++    Integer& operator++(int); //member function postfix ++    friend Integer& operator++(Integer& i);//friend function prefix ++    friend Integer& operator++(Integer& i, int);//friend function postfix ++private:    int n_;};#endif//INTEGER_HEAD_FILE

#include "Integer.h"Integer::Integer(int n):n_(n){}Integer::~Integer(){}void Integer::Display() const{cout << n_ << endl;}//最好优先使用成员函数重载,//成员函数prefix ++Integer& Integer::operator++(){++n_;return *this;}//成员函数postfix ++Integer& Integer::operator++(int){    Integer tmp(n_);    ++n_;    return tmp;}//友元prefix ++Integer& operator++(Integer& i){    ++i.n_;    return i;}//友元postfix ++Integer& operator++(Integer& i, int){    Integer tmp(i.n_);    ++i.n_;    return tmp;}

Done!

0 0
原创粉丝点击