可重載的一元運(yùn)算符如下:
- !(邏輯“非”)
- &(取址)
- ~(二進(jìn)制反碼)
- *(取消指針引用)
- +(一元加)
- -(一元求反)
- ++(遞增)
- --(遞減)
- 轉(zhuǎn)換運(yùn)算符
后綴遞增和遞減運(yùn)算符(++ 和 ––)在遞增和遞減中單獨(dú)處理,下面會(huì)講到。
以下規(guī)則適用于所有其他一元運(yùn)算符。若要將一元運(yùn)算符函數(shù)聲明為非靜態(tài)成員,則必須用以下形式聲明它:
ret-type operator op ()
其中 ret-type 是返回類(lèi)型,op 是上表中列出的運(yùn)算符之一。
若要將一元運(yùn)算符函數(shù)聲明為全局函數(shù),則必須用以下形式聲明它:
ret-type operator op (arg )
其中 ret-type 和 op 如上所述用于成員運(yùn)算符函數(shù),arg 是要參與運(yùn)算的類(lèi)類(lèi)型的參數(shù)。
注意
一元運(yùn)算符的返回類(lèi)型沒(méi)有限制。例如,邏輯“非”(!) 返回整數(shù)值是合理的,但并非強(qiáng)制性的。
遞增和遞減運(yùn)算符重載
由于遞增和遞減運(yùn)算符各有兩個(gè)變量,因此它們屬于一個(gè)特殊類(lèi)別:
- 前置遞增和后置遞增
- 前置遞減和后置遞減
編寫(xiě)重載的運(yùn)算符函數(shù)時(shí),為這些運(yùn)算符的前綴和后綴版本實(shí)現(xiàn)單獨(dú)的版本很有用。若要區(qū)分這兩者,請(qǐng)遵循以下規(guī)則:運(yùn)算符的前綴形式與聲明任何其他一元運(yùn)算符的方式完全相同;后綴形式接受 int 類(lèi)型的其他參數(shù)。
注意
當(dāng)為遞增或遞減運(yùn)算符的前綴形式指定重載運(yùn)算符時(shí),其他參數(shù)的類(lèi)型必須是 int;指定任何其他類(lèi)型都將產(chǎn)生錯(cuò)誤。
以下示例顯示如何為 Point 類(lèi)定義前綴和后綴遞增和遞減運(yùn)算符:
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
|
// increment_and_decrement1.cpp class Point { public : // Declare prefix and postfix increment operators. Point& operator++(); // Prefix increment operator. Point operator++( int ); // Postfix increment operator. // Declare prefix and postfix decrement operators. Point& operator--(); // Prefix decrement operator. Point operator--( int ); // Postfix decrement operator. // Define default constructor. Point() { _x = _y = 0; } // Define accessor functions. int x() { return _x; } int y() { return _y; } private : int _x, _y; }; // Define prefix increment operator. Point& Point::operator++() { _x++; _y++; return * this ; } // Define postfix increment operator. Point Point::operator++( int ) { Point temp = * this ; ++* this ; return temp; } // Define prefix decrement operator. Point& Point::operator--() { _x--; _y--; return * this ; } // Define postfix decrement operator. Point Point::operator--( int ) { Point temp = * this ; --* this ; return temp; } int main() { } |
可使用以下函數(shù)頭在文件范圍中(全局)定義同一運(yùn)算符:
1
2
3
4
|
friend Point& operator++( Point& ) // Prefix increment friend Point& operator++( Point&, int ) // Postfix increment friend Point& operator--( Point& ) // Prefix decrement friend Point& operator--( Point&, int ) // Postfix decrement |
表示遞增或遞減運(yùn)算符的后綴形式的 int 類(lèi)型的參數(shù)不常用于傳遞參數(shù)。它通常包含值 0。但是,可按以下方式使用它:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
// increment_and_decrement2.cpp class Int { public : Int &operator++( int n ); private : int _i; }; Int& Int::operator++( int n ) { if ( n != 0 ) // Handle case where an argument is passed. _i += n; else _i++; // Handle case where no argument is passed. return * this ; } int main() { Int i; i.operator++( 25 ); // Increment by 25. } |
除顯式調(diào)用之外,沒(méi)有針對(duì)使用遞增或遞減運(yùn)算符來(lái)傳遞這些值的語(yǔ)法,如前面的代碼所示。實(shí)現(xiàn)此功能的更直接的方法是重載加法/賦值運(yùn)算符 (+=)。