运算符重载(递增运算符)

递增操作符的重载

  • 前置递增:比如 ++i:先对 i 进行加一操作,i++:返回的是 i 自增之前的值

  • ++i 的返回是可修改值,然而 i++ 的返回是不可以修改的值。

    (1)(i++)++ ; 编译错误

    (2)(++i)++ ; 编译通过

  • 重载代码实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include<iostream>
using namespace std;
class MyInt {
friend ostream& operator<<(ostream& cout, MyInt p);
public:
MyInt(int num) :m_num(num){ }
//重载 前置++运算符
MyInt& operator++() {//先加1,后返回
this->m_num += 1;
return *this;//返回解引用,即返回自身,实现链式递增
}
//重载 后置++运算符
//c++中要求:int 代表占位参数,用来区分前置和后置
const MyInt operator++(int) {
//把旧的先复制一份,在把原来的加一,最后将复制的那份返回去。
MyInt temp = *this;//先记录当前结果
m_num++;//递增
return temp;//返回记录结果
}
private:
int m_num;
};
ostream& operator<<(ostream& cout, MyInt p) {
cout << p.m_num;
return cout;
}
void test01() {
MyInt p(10);
cout << p << endl;
cout << ++p << endl;
}
void test02() {
MyInt p(10);
cout << p++ << endl;
cout << p << endl;
}
int main() {
test01();
test02();
return 0;
}

前置后置的区别

  • 返回值

    前置递增返回的是操作对象自身,所以返回值类型是引用。

    后置递增返回的是局部对象,并且因为c++自身实现的后置递增运算 i++ 是不可修改的,所以返回值是 const 对象,否则像 (i++)++ 这样的代码是可以通过编译的,让人误以为真的可以实现递增两次,实际上是不可以的,第一次递增作用在自身,第二次是作用在返回的临时对象上。

  • 效率

    后置递增相比前置递增而言,增加了一个临时对象的创建,就会多出构造和析构的开销,效率便不如前置递增。