第7章 函式 9

2021-06-02 00:41:43 字數 1332 閱讀 8361

7.7.4 類**檔案的組織

通常將類的宣告放置在標頭檔案中。大多數情況下,在類外定義的成員函式則置於原始檔中。c++程式設計師習慣使用一些簡單的規則給標頭檔案及其關聯的類定義**命名。類定義應置於名為type.h或type.h的檔案中,type指在該檔案中的類的名字。成員函式的定義則一般儲存在與類同名的原始檔中。

7.8 過載函式

出現在相同作用域中的兩個函式,如果具有相同的名字而形參表不同,則稱為過載函式(overloaded function)。

程式設計師可以定義一組函式,它們執行同樣的一般性動作,但是應用在不同的形參型別上。呼叫這些函式時,無需擔心呼叫的是哪個函式。

任何程式都都僅有乙個main函式的例項。main函式不能過載。

如果兩個函式宣告的返回型別和形參表完全匹配,則將第二個函式宣告視為第乙個的重複宣告。如果兩個函式的形參表完全相同,但返回型別不同,則第二個宣告是錯誤的。

函式不能僅僅基於不用的返回型別而實現過載。

7.8.1 過載與作用域

在函式中區域性宣告的名字將遮蔽在全域性作用域內宣告的同名名字。

一般的作用域規則同樣適用於過載函式名。如果區域性地宣告乙個函式,則該函式將遮蔽而不是過載在外層作用域中的同名函式。由此推論,每乙個版本的過載函式都應在同乙個作用域中宣告。

7.8.2 函式匹配與實參轉換

函式過載確定(overload resolution,即函式匹配)是將函式呼叫與過載函式集合中的乙個函式相關聯的過程。通過自動提取函式呼叫中實際使用的實參與過載集合中各個函式提供的形參做比較,編譯器實現該呼叫與函式的匹配。匹配結果有三種可能:

(1) 編譯器找到與實參最佳匹配(best match)的函式,並生成呼叫函式的**。

(2) 找不到形參與函式呼叫的實參匹配的函式,在這種情況下,編譯器將給出編譯錯誤資訊。

(3) 存在多個與實參匹配的函式,但沒有乙個是明顯的最佳選擇。這種情況也是錯誤的,該呼叫具有二義性。

7.8.3 過載確定的三個步驟

1. 候選函式

函式過載確定的第一步是確定該呼叫所考慮的過載函式集合,該集合中的函式稱為候選函式(candidate function)。候選函式是與被呼叫函式同名的函式,並且在呼叫點上,它的宣告可見。

2. 選擇可行函式

第二步是從候選函式中選擇乙個或多個函式,它們能夠用該呼叫中指定的實參來呼叫。因此,選出來的函式稱為可行函式(viable function)。可行函式必須滿足兩個條件:第一,函式的形參個數與該呼叫的實參個數相同;第二,每乙個實參的型別必須與對應形參的型別匹配,或者可被隱式轉換為對應的形參型別。

3. 尋找最佳匹配(如果有的話)

函式過載確定的第二步是確定與函式呼叫中使用的實際引數最佳的可行函式。其原則是實參型別與形參型別越接近則匹配越佳。

第7章 函式 7

7.7 類的成員函式 函式原型必須在類中定義。但是,函式體則既可以在類中也可以在類外定義。7.7.1 定義成員函式的函式體 類的所有成員都必須在類定義的花括號裡面宣告,此後,就不能再為類增加任何成員。類的成員函式必須加宣告的一般定義。類的成員函式既可以在類的定義內也可以在類的定義外定義。編譯器隱式地...

第7章 函式 4

7.2.5 傳遞給函式的陣列的處理 非引用陣列形參的型別檢查只是確保實參是和陣列元素具有同樣型別的指標,而不會檢查實參實際上是否指向指定大小的陣列。任何處理陣列的程式都要確保程式停留在陣列的邊界內。第一種方法是在陣列本身放置乙個標記來檢測陣列的結束,c風格字串是一種字元陣列,並且以空字元null作為...

第7章 函式 6

7.5 區域性物件 在函式中定義的形參和變數的名字只位於函式的作用域中 這些名字只在函式體中可見。通常,變數名從宣告或定義的地方開始到包圍它的作用域結束處都是可用的。7.5.1 自動物件 只用當定義它的函式被呼叫時才存在的物件稱為自動物件 automatic object 自動物件在每次呼叫函式時建...