微信公眾號:「小林coding」
用簡潔的方式,分享編程小知識,
01 ++、--運算子多載函式的格式
自增運算子和自減運算子是有前置和后置之分的,如:
a++ // 后置自增運算子
++a // 前置自增運算子
b-- // 后置自減運算子
--b // 前置自減運算子
為了區分所多載的是前置運算子還是后置運算子,C++規定:
- 前置運算子作為一元運算子多載,多載為成員函式的格式如下:
T & operator++(); // 前置自增運算子的多載函式,函式引數是空
T & operator--(); // 前置自減運算子的多載函式,函式引數是空
- 后置運算子作為二元運算子多載,多寫一個沒用的引數,多載為成員函式的個數如下:
T operator++(int); // 后置自增運算子的多載函式,多一個沒用的引數
T operator--(int); // 后置自減運算子的多載函式,多一個沒用的引數
02 討論前置和后置運算子的回傳值
前置和后置運算子多載函式如下:
| 前置運算子多載的成員函式 | 后置運算子多載的成員函式 |
|---|---|
| T & operator++(); | T operator++(int); |
| T & operator--(); | T operator--(int); |
注意到區別了嗎?那么問題來了:
- 為什么前置運算子回傳的是參考
&? - 為什么后置運算子回傳的是普通的物件(臨時物件)?
主要是因為為了保持原本 C++ 前置和后置運算子的特性:
- 前置運算子的特性
int a = 0
// (++a) = 5; 可以拆解成:
// a = a + 1;
// a = 5;
(++a) = 5; // 前置++
a 先自增 +1 后, a 的值就為 1 ,然后再參與 a=5 的運算,所以最后 a 的值是 5,
這說明 (++a) 回傳的是自增后 a 變數, a 變數在后續運算程序中,a 變數的值會被修改,所以前置運算子的多載函式的回傳值必須是參考 &,
- 后置運算子的特性
而后置運算子,是不能作為左值的,也就是 (a++) = 5; 是不成立的,所以后置運算子的多載函式的回傳值就是普通的物件,
03 ++、--運算子多載函式的撰寫
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
假設要實作如上的 main 函式輸出的結果,該如何撰寫呢?
首先我們先定義好 CDemo 類,同時也把自增、自減運算子多載函式定義好,
class CDemo
{
public:
CDemo(int i = 0):m_num(i) {} // 建構式
CDemo & operator++(); // 前置自增運算子多載
CDemo operator++(int); // 后置自增運算子多載
CDemo & operator--(); // 前置自減運算子多載
CDemo operator--(int); // 后置自減運算子多載
private:
int m_num; // 成員變數
};
接著繼續實作前置自增、自減運算子多載函式:
// 前置++
CDemo & CDemo::operator++()
{
++m_num;
return *this;
}
// 前置--
CDemo & CDemo::operator--()
{
--m_num;
return *this;
}
后置自增、自減運算子多載,就有點不同,例如后置++,是先參與運算,再進行自增,所以回傳值是沒自增前的物件,具體實作如下:
// 后置++
CDemo CDemo::operator++(int)
{
CDemo tmp(*this); // 記錄修改前的物件
m_num--;
return tmp; // 回傳修改前的物件
}
// 后置--
CDemo CDemo::operator--(int)
{
CDemo tmp(*this); // 記錄修改前的物件
m_num++;
return tmp; // 回傳修改前的物件
}
04 前置和后置運算子的性能比較
從上面的例子,我們看到后置運算子的多載函式的執行步驟:
- 先要產生一個臨時物件來保存未自增或自減前的物件;
- 接著成員變數自增或自減;
- 最后回傳修改前的物件;
而前置運算子的多載函式的執行步驟:
- 成員變數自增或自減;
- 回傳物件參考;
可見,前置運算子的多載函式是比后置運算子的多載函式性能是更高的,開銷相對比較少,
當然對于普通變數型別,如int、double、long等,前置和后置是性能差距是不大的,重要是我們在對于物件和迭代器使用自增或自減時,最好用前置的運算子的方式,這樣可以減少開銷,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/83183.html
標籤:C++
下一篇:ACM | 演算法 | 快速冪

