溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

C++新增基礎(chǔ)功能解析—函數(shù)重載功能的使用

發(fā)布時(shí)間:2020-07-10 17:46:23 來(lái)源:網(wǎng)絡(luò) 閱讀:233 作者:宋國(guó)建 欄目:編程語(yǔ)言

“函數(shù)重載”指的是可以有多個(gè)同名的函數(shù),因此 名稱(chēng)進(jìn)行了重載。這兩個(gè)術(shù)語(yǔ)指的是同一回事,但我們通常使用函數(shù)重載??梢酝ㄟ^(guò)函數(shù)重載來(lái)設(shè)計(jì)? 系列函數(shù)——它們完成相同的工作,但使用不同的參數(shù)列表。
重載函數(shù)就像是有多種含義的動(dòng)詞。例如,Piggy×××可以在棒球場(chǎng)為家鄉(xiāng)球隊(duì)助威(root),也可以在地里種植(root)菌類(lèi)作物。根據(jù)上下文可以知道在每一種情況下,root的含義是什么。同樣,C++使用上下文來(lái)確定要使用的重載函數(shù)版本。
函數(shù)重載的關(guān)鍵是函數(shù)的參數(shù)列表——也稱(chēng)為函數(shù)特征標(biāo)(ftmction signature).如果兩個(gè)函數(shù)的參數(shù)數(shù)目和類(lèi)型相同,同時(shí)參數(shù)的排列順序也相同,則它們的特征標(biāo)相同,而變量名是無(wú)關(guān)緊要的。C++允定義名稱(chēng)相同的函數(shù),條件是它們的特征標(biāo)不同。如果參數(shù)數(shù)目和/或參數(shù)類(lèi)型不同,則特征標(biāo)也不同。例如,可以定義一組原型如下的print()函數(shù):

Void print(const char * str, int width) ;   // #1
Void print(double d, int width);            // #2
Void print(long 1, int width);           // #3 
Void print(int i, int width);                // #4 frombyte
Void print(const char *str);                 // #5

使用pnnt()函數(shù)時(shí),編譯器將根據(jù)所采取的用法使用有相應(yīng)特征標(biāo)的原型:

print(” Pancakes", 15);         //use #1
print(” syrup");                //use #2
print(” 1999.0,10");                //use #3
print(” 1999,12");              //use #4
print(” 1999L,15");             //use #5 frombyte.com

例如,print(“Pancakes”,15)使用一個(gè)字符串和一個(gè)整數(shù)作為參數(shù),這與#1原型匹配。 ,使用被重載的函數(shù)時(shí),需要在函數(shù)調(diào)用中使用正確的參數(shù)類(lèi)型。例如,對(duì)于下面的語(yǔ)句:

Unsigned int year =3210;
print (year, 6);            // ambiguous call

Print()調(diào)用與哪個(gè)原型匹配呢?它不與任阿原型匹配!沒(méi)有匹配的圓形并不會(huì)自動(dòng)停止使用其中的某個(gè)函數(shù),因?yàn)镃++將嘗試使用標(biāo)準(zhǔn)類(lèi)型轉(zhuǎn)換強(qiáng)制進(jìn)行匹配。如果#2原型是print()唯一的原型,則函數(shù)調(diào)用print(year,6)將把year轉(zhuǎn)換為double類(lèi)型。但在上面的代碼中,有3個(gè)將數(shù)字作為第一個(gè)參數(shù)的原型,因此有3種轉(zhuǎn)換year的方式。在這種情況下,C++將拒絕這種函數(shù)調(diào)用,并將其視為錯(cuò)誤。
一些看起來(lái)彼此不同的特征標(biāo)是不能共存的。例如,請(qǐng)看下面的兩個(gè)原型:

duble cube (double x);
duble cube (double & x);

您可能認(rèn)為可以在此處使用函數(shù)重載,因?yàn)樗鼈兊奶卣鳂?biāo)看起來(lái)不同。然而,請(qǐng)從編譯器的角度來(lái)考慮這個(gè)問(wèn)題。假設(shè)有下面這樣的代碼:
cout.<< cube(x);
參數(shù)X與double x原型和double &x原型都匹配,因此編譯器無(wú)法確定究竟應(yīng)使用哪個(gè)原型。為避免這種混亂,編譯器在檢査函數(shù)特征標(biāo)時(shí),將把類(lèi)型引用和類(lèi)型本身視為同一個(gè)特征標(biāo)。 匹配函數(shù)時(shí),并不區(qū)分const和非const變量。請(qǐng)看下面的原型:

Void dribble(char * bits);
Void dribble (const char *cbits);
Void dabble(char * bits);
Void drivel(const char * bits);

下面列出了各種函數(shù)調(diào)用對(duì)應(yīng)的原型:

Const char p1[20]="How’s the weather?";
Char p2[20]="How's business?";
Dribble(p1);        // dribble(const char *); 
Dribble(p2);        // dribble(char *);
Dabble(p1);     // no match 
Dabble(p2);     // dabble(char *);
Drivel(p1);     // drivel(const char *);frombyte.com 
Drivel(p2);     // drivel(const char *);

dribble()函數(shù)有兩個(gè)原型,一個(gè)用于const指針,另一個(gè)用于常規(guī)指針,編譯器將根據(jù)實(shí)參是否為const來(lái)決定使用哪個(gè)原型。dribble()函數(shù)只與帶非const參數(shù)的調(diào)用匹配,而drivel()函數(shù)可以與帶const或非const參數(shù)的調(diào)用匹配。drivel?和dabble()之所以在行為上有這種差別,主要是由于將非const值賦給const變量是合法的,但反之則是非法的。
請(qǐng)記住,是特征標(biāo),而不是函數(shù)類(lèi)型使得可以對(duì)函數(shù)進(jìn)行重載。例如,下面的兩個(gè)聲明是互斥的:

long gronk(int n, float m); // same signatures,
double gronk(int n, float m);   // hence not allowed

因此,C++不允許以這種方式重載gronk()。返回類(lèi)型可以不同,但特征標(biāo)也必須不同:

long gronk(int n; float m); // different signatures,
double gronk(float n# float m); // hence allowed
向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI