8.3 參數的缺省值
有一些參數的值在每次函數調用時都相同,書寫這樣的語句會使人厭煩。C++語言采用參數的缺省值使書寫變得簡潔(在編譯時,缺省值由編譯器自動插入)。
參數缺省值的使用規則:
l 【規則8-3-1】參數缺省值只能出現在函數的聲明中,而不能出現在定義體中。
例如:
void Foo(int x=0, int y=0); // 正確,缺省值出現在函數的聲明中
void Foo(int x=0, int y=0) // 錯誤,缺省值出現在函數的定義體中
{
…
}
為什麼會這樣?我想是有兩個原因:一是函數的實現(定義)本來就與參數是否有缺省值無關,所以沒有必要讓缺省值出現在函數的定義體中。二是參數的缺省值可能會改動,顯然修改函數的聲明比修改函數的定義要方便。
l 【規則8-3-2】如果函數有多個參數,參數只能從後向前挨個兒缺省,否則將導致函數調用語句怪模怪樣。
正確的示例如下:
void Foo(int x, int y=0, int z=0);
錯誤的示例如下:
void Foo(int x=0, int y, int z=0);
要注意,使用參數的缺省值並沒有賦予函數新的功能,僅僅是使書寫變得簡潔一些。它可能會提高函數的易用性,但是也可能會降低函數的可理解性。所以我們只能適當地使用參數的缺省值,要防止使用不當產生負面效果。示例8-3-2中,不合理地使用參數的缺省值將導致重載函數output產生二義性。
#include <iostream.h>
void output( int x);
void output( int x, float y=0.0);
void output( int x)
{
cout << " output int " << x << endl ;
}
void output( int x, float y)
{
cout << " output int " << x << " and float " << y << endl ;
}
void main(void)
{
int x=1;
float y=0.5;
// output(x); // error! ambiguous call
output(x,y); // output int 1 and float 0.5
}
示例8-3-2 參數的缺省值將導致重載函數產生二義性
8.4 運算符重載
8.4.1 概念
在C++語言中,可以用關鍵字operator加上運算符來表示函數,叫做運算符重載。例如兩個復數相加函數:
Complex Add(const Complex &a, const Complex &b);
可以用運算符重載來表示:
Complex operator +(const Complex &a, const Complex &b);
運算符與普通函數在調用時的不同之處是:對於普通函數,參數出現在圓括號內;而對於運算符,參數出現在其左、右側。例如
Complex a, b, c;
…
c = Add(a, b); // 用普通函數
c = a + b; // 用運算符 +
如果運算符被重載為全局函數,那麼只有一個參數的運算符叫做一元運算符,有兩個參數的運算符叫做二元運算符。
如果運算符被重載為類的成員函數,那麼一元運算符沒有參數,二元運算符只有一個右側參數,因為對象自己成了左側參數。
從語法上講,運算符既可以定義為全局函數,也可以定義為成員函數。文獻[Murray , p44-p47]對此問題作了較多的闡述,並總結了表8-4-1的規則。
運算符
規則
所有的一元運算符
建議重載為成員函數
= () [] ->
只能重載為成員函數
+= -= /= *= &= |= ~= %= >>= <<=
建議重載為成員函數
所有其它運算符
建議重載為全局函數
表8-4-1 運算符的重載規則