函式過載定義:可以有多個同名的函式。可以使用函式過載來設計一系列函式-----它們完成相同的工作,但使用不同的引數列表。
函式過載的關鍵是函式的引數列表----也稱為函式特徵標(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_int
,void 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,僅僅返回值不同是不能作為函式過載,這屬於函式重定義 形參表包括 引數的型別 ...