余睿的博客

浮生若梦,别多会少,不如莫遇

0%

c++自增自减运算符重载

基本概念

自增运算符++以及自减运算符--有前置、后置之分,为了区分该运算符为前置还是后置,c++有如下规定:

  • 前置运算符作为一元运算符重载

    重载为成员函数:

    (注意:T为任意类型)

    T & operator++();

    T & operator--();

    重载为全局函数:

    T & operator++(T1);

    T & operator--(T1);

  • 后置运算符作为二元运算符重载,多写一个没用的参数。

    重载为成员函数:

    T & operator++(int);

    T & operator--(int);

    重载为全局函数:

    T & operator++(T1,int);

    T & operator--(T1,int);

通过多写一个参数来区分前置、后置的区别。

样例

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
class Demo {
int n;
public:
Demo(int i=0):n(0){}
Demo& operator++();//前置++
Demo operator++(int);//后置++
operator int() { return n; };//重载强制类型转换运算符,用于直接输出结果
friend Demo& operator--(Demo& d);//前置--
friend Demo operator--(Demo&, int);//后置--
};
Demo& Demo::operator++(){//前置++
++n;
return *this;
}//++s即为s.operator++();

Demo Demo::operator++(int){//后置++
Demo temp(*this);//记录修改前内容
n++;
return temp;//返回修改前内容
}//s++即为s.operator++(0)

Demo& operator--(Demo& d) {//前置--
d.n--;
return d;
}//--s即为operator--(s)

Demo operator--(Demo& d, int) {//后置--
Demo temp(d);//记录操作前数据
d.n--;
return temp;//返回--前数据
}//s--相当于operator--(d,0)

在上面的程序中,我们将++运算符重载为成员函数,将--运算符重载为全局函数。为了使得--运算符能访问私有变量,需要将其写为Demo类的友元函数。

并且重载int()强制类型转换运算符,使得能直接输出n的值。

需要注意的时,为了维持c++原有的计算特性,需要将前置++/--运算符的返回值写为同类对象的引用。

对于上面的类,假设我们有如下调用:

1
2
3
4
5
6
7
8
9
10
11
12
int main() {
Demo d(1);
cout << (d++) << ",";
cout << d << ",";
cout << (++d) << ",";
cout << d << endl;
cout << (d--) << ",";
cout << d << ",";
cout << (--d) << ",";
cout << d << endl;
return 0;
}

得到结果:

1
2
0,1,2,2
2,1,0,0

运算符重载注意事项

  1. c++不允许定义新的运算符
  2. 重载后运算符的含义应当复合日常习惯
  3. 运算符重载不改变运算符的优先级
  4. 以下运算符不能被重载".",".*","::","?:","sizeof"
  5. ()、[]、->、=只能重载为成员函数

欢迎关注我的其它发布渠道