C++ 自增、自减运算符的重载和性能分析
扫描二维码
随时随地手机看文章
— 1 —
重载的形式
a++ // 后置自增运算符
++a // 前置自增运算符
b-- // 后置自减运算符
--b // 前置自减运算符
为了区分所重载的是「前置」运算符还是「后置」运算符,C++规定:
「前置」运算符作为一元运算符重载,重载为成员函数的形式如下:
// 前置自增运算符的重载函数,函数参数是空
T & operator++();
// 前置自减运算符的重载函数,函数参数是空
T & operator--();
「后置」运算符作为二元运算符重载,多写一个没用的参数,重载为成员函数的形式如下:
// 后置自增运算符的重载函数,多一个没用的参数
T operator++(int);
// 后置自减运算符的重载函数,多一个没用的参数
T operator--(int);
— 2 —
返回值的讨论
前置运算符重载的成员函数 | 后置运算符重载的成员函数 |
---|---|
T & operator++(); | T operator++(int); |
T & operator--(); | T operator--(int); |
注意到区别了吗?那么问题来了:
为什么「前置」运算符返回的是引用 & ?
为什么「后置」运算符返回的是普通的对象(临时对象)?
前置运算符的特性
int a = 0
// (++a) = 5;
// 可以拆解成:
// 1. a = a + 1;
// 2. a = 5;
(++a) = 5; // 前置++
后置运算符的特性
而后置运算符,是不能作为左值的,也就是 (a++) = 5; 是不成立的,所以后置运算符的重载函数的返回值就是普通的对象。
— 3 —
重载函数的编写
int main()
{
CDemo d(10);
cout << d++ << ","; // 等价于 d.operator++(0);
cout << d << ",";
cout << ++d << ","; // 等价于 d.operator++();
cout << d << ",";
cout << d-- << ","; // 等价于 d.operator--(0);
cout << d << ",";
cout << --d << ","; // 等价于 d.operator--();
cout << d << endl;
return 0;
}
10,11,12,12
12,11,10,10
— 4 —
性能比较
-
先要产生一个临时对象来保存未自增或自减前的对象; -
接着成员变量自增或自减; -
最后返回修改前的对象(临时对象);
-
成员变量自增或自减; -
返回对象引用;
小林coding
免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!