程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> 高質量C++/C編程指南-第8章-C++函數的高級特性(4)

高質量C++/C編程指南-第8章-C++函數的高級特性(4)

編輯:關於C++

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 運算符的重載規則

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved