C 函式過載 詳解

2021-08-15 12:48:08 字數 2301 閱讀 4065

在實際開發中,有時候我們需要實現幾個功能類似的函式,只是有些細節不同。例如希望交換兩個變數的值,這兩個變數有多種型別,可以是 int、float、char、bool 等,我們需要通過引數把變數的位址傳入函式內部。在c語言中,程式設計師往往需要分別設計出三個不同名的函式,其函式原型與下面類似:

void

swap1

(int

*a,int

*b);

//交換 int 變數的值

void

swap2

(float

*a,float

*b);

//交換 float 變數的值

void

swap3

(char

*a,char

*b);

//交換 char 變數的值

void

swap4

(bool

*a,bool

*b);

//交換 bool 變數的值

但在c++中,這完全沒有必要。c++ 允許多個函式擁有相同的名字,只要它們的引數列表不同就可以,這就是

函式的過載(function overloading)

。借助過載,乙個函式名可以有多種用途。

引數列表又叫引數簽名,包括引數的型別、引數的個數和引數的順序,只要有乙個不同就叫做引數列表不同。

【示例】借助函式過載交換不同型別的變數的值:

#include

using

namespace std;

//交換 int 變數的值

void

swap

(int

*a,int

*b)//交換 float 變數的值

void

swap

(float

*a,float

*b)//交換 char 變數的值

void

swap

(char

*a,char

*b)//交換 bool 變數的值

void

swap

(bool

*a,bool

*b)int

main

()

執行結果:

200, 100

56.93, 12.5

b, a

1, 0

本例之所以使用swap這個函式名,而不是使用swap,是因為 c++ 標準庫已經提供了交換兩個變數的值的函式,它的名字就是swap,位於algorithm標頭檔案中,為了避免和標準庫中的swap衝突,本例特地將s大寫。

既然標準庫已經提供了 swap() 函式,本例為何又要自己實現一遍呢,這不是費力不討好嗎?交換兩個變數的值是乙個經典且實用的函式過載案例,本例這樣做僅僅是為了教學演示,並不是要替代標準庫中的 swap(),讀者在以後的編碼過程中也應該堅持使用標準庫中的 swap()。

通過本例可以發現,過載就是在乙個作用範圍內(同乙個類、同乙個命名空間等)有多個名稱相同但引數不同的函式。過載的結果是讓乙個函式名擁有了多種用途,使得命名更加方便(在中大型專案中,給變數、函式、類起名字是一件讓人苦惱的問題),呼叫更加靈活。

在使用過載函式時,同名函式的功能應當相同或相近,不要用同一函式名去實現完全不相干的功能,雖然程式也能執行,但可讀性不好,使人覺得莫名其妙。

注意,引數列表不同包括引數的個數不同、型別不同或順序不同,僅僅引數名稱不同是不可以的。函式返回值也不能作為過載的依據。

函式的過載的規則:

c++**在編譯時會根據引數列表對函式進行重新命名,例如void swap(int a, int b)會被重新命名為_swap_int_intvoid swap(float x, float y)會被重新命名為_swap_float_float。當發生函式呼叫時,編譯器會根據傳入的實參去逐個匹配,以選擇對應的函式,如果匹配失敗,編譯器就會報錯,這叫做

過載決議(

overload resolution)。

不同的編譯器有不同的重新命名方式,這裡僅僅舉例說明,實際情況可能並非如此。
從這個角度講,函式過載僅僅是語法層面的,本質上它們還是不同的函式,占用不同的記憶體,入口位址也不一樣

C 函式過載詳解

我們在開瓶瓶罐罐的時候,經常會遭遇因各種瓶口規格不同而找不到合適的工具的尷尬。所以有時候就為了開個瓶,家裡要備多種規格的開瓶器。同樣是開個瓶子嘛,何必這麼麻煩?於是有人發明了多功能開瓶器,不管啤酒瓶汽水瓶還是軟木塞的紅酒瓶都能輕鬆開啟。然而開瓶器的問題也會發生到程式設計中。比如我們要編寫乙個函式來求...

C 函式過載詳解

我們在開瓶瓶罐罐的時候,經常會遭遇因各種瓶口規格不同而找不到合適的工具的尷尬。所以有時候就為了開個瓶,家裡要備多種規格的開瓶器。同樣是開個瓶子嘛,何必這麼麻煩?於是有人發明了多功能開瓶器,不管啤酒瓶汽水瓶還是軟木塞的紅酒瓶都能輕鬆開啟。然而開瓶器的問題也會發生到程式設計中。比如我們要編寫乙個函式來求...

C 函式過載詳解

一 函式過載定義 同一作用域空間中,定義多個同名函式,該系列同名函式函式形參鬚或型別或個數或順序不同。1 函式形參個數 型別 順序三者中須至少乙個不同 a 函式形參個數不同 int max int var1,int var2 int max int var1,int var2,int var3 b ...