我们这里选择重点讲解前置/后置自增的重载
前置/后置自减就是一个道理啦
前置自增 ++num
前置自增:先自增再取值
重载前置自增允许有两种形式
成员函数:
num.operator++()
Data &operator++();全局函数:
operator++(num)
Data &operator++(Data &);
需要提醒大家的是,在重载前置自增的时候,返回的是引用
我们在哪里还建议大家重载结束后返回引用?
没错,就是对<<
和>>
的重载:
ostream &operator<<(ostream &,const Data &);
istream &operator>>(istream &,Data &);
之所以选择返回引用,很大的一个原因是为了之后能够级联使用该运算符:
cin>>x>>y;
cout<<u<<v;
++(++num);
当然,函数也好,重载运算符也好,选择返回引用还是返回值,主要的依据还是函数的功能和程序的需求
在这里不得不啰嗦一句,有些函数返回的是有const修饰的引用,这个时候就要格外注意:该函数返回的对象不能作为表达式的左值
更详细的const和&介绍可以去之前的blog里考古~
文章结尾介绍const和&的基本含义
实例讲解助力实战
可见const和&的运用,一直以来都是编程中的一个难点
后置自增 num++
后置自增:先取值再自增
重载前置自增允许有两种形式
成员函数:
num.operator++(integer)
const Data operator++(int);全局函数:
operator++(num,integer)
const Data operator++(Data &,int);
可以看到,对于后置自增的重载,函数的参数有所增加,也没有选择返回引用,返回值还有const关键字修饰
这就说明后置自增返回的只是一个临时对象(拷贝值)
临时对象
临时对象是无法用肉眼观察到的,用完就析构。
① 类型转换:void f(Two) {cout << "Function f called." << endl;} f(one); //Two的临时对象
② 无名临时对象:Integer t = Interger(10);
③ 函数返回对象:cout<<String(5,15);
随之而来一个问题:
num++只能作为表达式的右值(我们不能对后置自增返回的值进一步操作)
++num既可以作为表达式的左值也可以作为表达式的右值
(a++)++; //CE
++(a++); //CE
a++ = 1; //CE(++a)++; //OK
++(++a); //OK
++a = 1; //OK
重载测试
#include<iostream>
using namespace std;class Test{friend ostream &operator<<(ostream &output,const Test &A) {output<<A.value;return output;}
public:Test():value(0) {};Test &operator++() {value++;return (*this);}const Test operator++(int) {Test tmp=(*this);++(*this);return tmp;}
private:int value;
};int main() {Test num;cout<<num++<<endl;cout<<++num<<endl;system("pause");return 0;
}
//Output
0
2