天天看點

C++ 函數 函數的重載 有預設參數的函數

c++允許用同一函數名定義多個函數,這些函數的參數個數和參數類型不同。這就是函數的重載(function overloading)。

參數的個數和類型可以都不同。但不能隻有函數的類型不同而參數的個數和類型相同。

也就是說重載與否是由參數決定的,而不是傳回值決定!!!

這裡引入一個概念:

函數簽名:函數的名稱及其參數類型組合在一起,就定義了一個唯一的特性,稱為函數簽名。(不包括傳回類型)

c++要求重載函數具有不同的簽名。傳回類型不是函數簽名的一部分。

c++ requires that overloaded functions have distinct signature.the return type is not part of a function’s signature.

例如:

下面介紹重載中的二義性問題:

如果兩個不同寬度的資料類型進行運算時,編譯器會盡可能地在不丢失資料的情況下将它們類型統一。若float和double運算時,如果不顯式地指定為float型,會自動轉換成double型進行計算。一個整數類型int和一個浮點類型float運算時,如果不顯式地指定為int型,c++會先将整數轉換成浮點數。

上述 語句中float y=2.1 我們以為它是一個float類型,但編譯器卻把它認為是double(因為小數預設是double型),是以給出了警示資訊,一般要定義float類型,則應該改成2.1f。

通常編譯器會按照傳回類型、參數類型、參數數量區 差別調用哪個重載函數,但有時候,資料類型自動轉換機制會使編譯器進入死胡同。

在這裡編譯器不知道應該講x=fun(5)轉換成float還是double。

一般情況下,在函數調用時形參從實參那裡取得值,是以實參的個數應與形參相同。c++允許在定義函數時給其中的某個或某些形式參數指定預設值,這樣,當發生函數調用時,如果省略了對應位置上的實參的值時,則在執行被調函數時,以該形參的預設值進行運算。有時多次調用同一函數時用同樣的實參,給形參一個預設值,這樣形參就不必一定要從實參取值了。如有一函數聲明

如果不想使形參取此預設值,則通過實參另行給出

實參與形參的結合是從左至右順序進行的。是以指定預設值的參數必須放在形參表列中的最右端,否則出錯。例如:

在使用帶有預設參數的函數時有兩點要注意:

(1)如果函數的定義在函數調用之前,則應在函數定義中給出預設值。如果函數的定義在函數調用之後,則在函數調用之前需要有函數聲明,此時必須在函數聲明中給出預設值,在函數定義時可以不給出預設值。

(2)一個函數不能既作為重載函數,又作為有預設參數的函數。因為當調用函數時如果少寫一個參數,系統無法判定是利用重載函數還是利用預設參數的函數,出現二義性,系統無法執行。

 預設參數一般在函數聲明中提供。如果程式中既有函數的聲明又有函數的定義時,則定義函數時不允許再定義參數的預設值。

預設值可以是全局變量、全局常量,甚至是一個函數。例如:

預設值不可以是局部變量,因為預設參數的函數調用是在編譯時确定的,而局部變量的位置與值在編譯時均無法确定。

作者:王陸