C 函式過載

2021-10-11 18:53:30 字數 3142 閱讀 3404

函式過載定義:可以有多個同名的函式。可以使用函式過載來設計一系列函式-----它們完成相同的工作,但使用不同的引數列表。

函式過載的關鍵是函式的引數列表----也稱為函式特徵標(funtion signature).如果兩個函式的引數數目和型別相同,同時引數的排列順序也相同,則它們的特徵標相同,而變數名是無關緊要的。c++允許定義名稱相同額函式,條件是它們的特徵標不同。如果引數數目或者引數型別不同,則特徵標也不同。

【示例】定義一組原型如下的printf()函式:

void

printf

(const

char

* str,

int width); #1

void

printf

(double d,

int width)

; #2

void

printf

(long k,

int width)

; #3

void

printf

(int i,

int width)

; #4

void

printf

(const

char

*str)

; #5

使用printf()函式時,編譯器將根據所採取的用法使用有相應特徵標的原型:

printf

("hello",15

); #1

printf

("hello"

); #5

printf

(1000.0,15

); #2

printf

(1000,15

); #4

printf

(1000.l,15

); #3

例如:printf(「hello」,15); 使用乙個字串和乙個整數作為引數,這與#1原型匹配。

使用被過載的函式時,需要在函式呼叫中使用正確的引數型別。例如:

unsigned

int y=

100;

printf

(y,6);

//ambiguous call

printf()呼叫與哪個原型匹配呢?它不與任何原型匹配!沒有匹配的原型並不會自動停止使用其中的某個函式,因為c++將嘗試使用標準型別轉換強制進行匹配。如果#2原型是printf()唯一的原型,則函式呼叫printf(y,6)將把y轉換為double型別。但是在上面的**中,有三個將數字作為第乙個引數的原型,因此有三種轉換y的方式。在這種情況下,c++將拒絕這種函式呼叫,並將其視為錯誤。

一些看起來彼此不同的的特徵標是不能共存的。例如:

double

cube

(double x)

;double

cube

(double

& x)

;

這裡不構成過載。從編譯器的角度來考慮這個問題。

假如有這樣的**:

cout<<

cube

(x);

引數x與double x 原型和double &x原型都匹配。因此編譯器無法確定究竟應使用哪個原型。為避免這種混亂,編譯器在檢查函式特徵標時,將把型別引用和型別本身視為同乙個特徵標

匹配函式時,並不區分const 和非const 變數。請看下面的原型:

voidf(

char

*p); #1

voidf(

const

char

* p) #2

voidy(

char

*p) #3

voidk(

const

char

* p) #4

下面列出了各種函式呼叫相應的原型:

cosnt char p1[20]

="hell world"

;char p2[20]

="good ";f

(p1)

; #2

f(p2)

; #1

y(p1)

; #no match

y(p2)

; #1

k(p1)

; #4

k(p2)

; #4

f()函式原型有兩個原型,乙個用於const指標,另乙個用於常規指標,編譯器將根據實參是否為const來決定使用哪個原型。y()函式只與非const 引數的呼叫匹配,而k()函式可以與帶const 或非const 引數的呼叫匹配。y()和k()之所以在行為上有這種差別,主要是由於將非const值賦給const變數是合法的,但反之是非法的。(範圍可以縮小,不可以放大)。

函式的過載的規則:

不可以構成過載的情況:

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

不同的編譯器有不同的重新命名方式,這裡僅僅舉例說明,實際情況可能並非如此。

從這個角度講,函式過載僅僅是語法層面的,本質上它們還是不同的函式,占用不同的記憶體,入口位址也不一樣。

mysql 函式過載 C 方法過載(函式過載)

在講解 c 構造方法 時提到定義構造方法時提到可以定義帶 0 到多個引數的構造方法,但構造方法的名稱必須是類名。實際上,這就是乙個典型的方法過載,即方法名稱相同 引數列表不同。引數列表不同主要體現在引數個數或引數的資料型別不同。在呼叫過載的方法時系統是根據所傳 遞引數的不同判斷呼叫的是哪個方法。例項...

C 函式 函式過載

如果同一作用域內的幾個函式名字相同但形參列表不同,我們稱之為過載函式。void print const char cp void print const int beg,const int end void print const int ia,size t size 這些函式接受的形參型別不一樣,...

C 函式過載

函式過載 overloaded function 在相同的作用域中的兩個函式,如果有相同的名字而形參表不同 注意 如果僅僅函式的返回值不同是不能實現函式過載 void func int int func int error,僅僅返回值不同是不能作為函式過載,這屬於函式重定義 形參表包括 引數的型別 ...