C++ 自增、自減運(yùn)算符的重載和性能分析
— 1 —
重載的形式
a++ // 后置自增運(yùn)算符
++a // 前置自增運(yùn)算符
b-- // 后置自減運(yùn)算符
--b // 前置自減運(yùn)算符
為了區(qū)分所重載的是「前置」運(yùn)算符還是「后置」運(yùn)算符,C++規(guī)定:
「前置」運(yùn)算符作為一元運(yùn)算符重載,重載為成員函數(shù)的形式如下:
// 前置自增運(yùn)算符的重載函數(shù),函數(shù)參數(shù)是空
T & operator++();
// 前置自減運(yùn)算符的重載函數(shù),函數(shù)參數(shù)是空
T & operator--();
「后置」運(yùn)算符作為二元運(yùn)算符重載,多寫一個(gè)沒(méi)用的參數(shù),重載為成員函數(shù)的形式如下:
// 后置自增運(yùn)算符的重載函數(shù),多一個(gè)沒(méi)用的參數(shù)
T operator++(int);
// 后置自減運(yùn)算符的重載函數(shù),多一個(gè)沒(méi)用的參數(shù)
T operator--(int);
— 2 —
返回值的討論
前置運(yùn)算符重載的成員函數(shù) | 后置運(yùn)算符重載的成員函數(shù) |
---|---|
T & operator++(); | T operator++(int); |
T & operator--(); | T operator--(int); |
注意到區(qū)別了嗎?那么問(wèn)題來(lái)了:
為什么「前置」運(yùn)算符返回的是引用 & ?
為什么「后置」運(yùn)算符返回的是普通的對(duì)象(臨時(shí)對(duì)象)?
前置運(yùn)算符的特性
int a = 0
// (++a) = 5;
// 可以拆解成:
// 1. a = a + 1;
// 2. a = 5;
(++a) = 5; // 前置++
后置運(yùn)算符的特性
而后置運(yùn)算符,是不能作為左值的,也就是 (a++) = 5; 是不成立的,所以后置運(yùn)算符的重載函數(shù)的返回值就是普通的對(duì)象。
— 3 —
重載函數(shù)的編寫
int main()
{
CDemo d(10);
cout << d++ << ","; // 等價(jià)于 d.operator++(0);
cout << d << ",";
cout << ++d << ","; // 等價(jià)于 d.operator++();
cout << d << ",";
cout << d-- << ","; // 等價(jià)于 d.operator--(0);
cout << d << ",";
cout << --d << ","; // 等價(jià)于 d.operator--();
cout << d << endl;
return 0;
}
10,11,12,12
12,11,10,10
— 4 —
性能比較
-
先要產(chǎn)生一個(gè)臨時(shí)對(duì)象來(lái)保存未自增或自減前的對(duì)象; -
接著成員變量自增或自減; -
最后返回修改前的對(duì)象(臨時(shí)對(duì)象);
-
成員變量自增或自減; -
返回對(duì)象引用;
小林coding
免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。文章僅代表作者個(gè)人觀點(diǎn),不代表本平臺(tái)立場(chǎng),如有問(wèn)題,請(qǐng)聯(lián)系我們,謝謝!