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

來源:互聯網
上載者:User

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.