首頁 > 軟體

C++淺析函數過載是什麼

2022-08-12 22:01:38

前言

這是一個非常重要的點

函數過載:是函數的一種特殊情況,C++允許在同一作用域中宣告幾個功能類似的同名函數。

這些同名函數的 形參列表(引數個數 或 型別 或 順序)必須不同,常用來處理實現功能類似資料型別不同的問題

或者說,給一個名字賦予第二層意義,一詞多義,有點內涵那意思

函數過載

首先C語言不允許定義同名的函數,但是C++可以,原因就涉及到了函數過載

函數過載的要求:函數名相同,引數不同(引數型別不同,引數個數不同)

例子:

定義三個函數名相同的函數,在C++中可以構成函數過載

這三個函數的函數名一樣,但是型別不同

int ADD(int left, int right) {
	return left + right;
}
double ADD(double left, double right) {
	return left + right;
}
long ADD(long left, long right) {
	return left + right;
}

它們的型別分別是int,double,long。

而且個數不同也能構成函數過載。

下面來列印玩一下(剛開始玩列印很正常,但是工作中很少用)

int main(void) {
	cout << ADD(1,2) << endl;
	cout << ADD(1.2, 2.2) << endl;
	cout << ADD(40l, 40l) << endl;
	return 0;
}

結果:

感覺是呼叫的是一個函數,但其實不止一個,因為這個函數被過載了,所以有三層定義。

實際上呼叫的是

1:int型別的

2:double型別的

3:long型別的。

一些其他問題

預設算不算過載 ?

//NO.1
int ADD(int left, int right) {
	return left + right;
}
//NO.2
int ADD(int left = 1, int right = 2) {
	return left + right;
}

注意 : NO.1和NO.2兩個不算過載,因為構成過載的條件是引數的型別不同或者個數不同,以上均不滿足 。過載只看型別

但是

//NO.2
int ADD(int left = 1, int right = 2) {
	return left + right;
}
//NO.3
double ADD(double left, double right) {
	return left + right;
}

NO.2和NO.3是構成過載的,因為滿足了過載的條件

函數過載的要求:函數名相同,引數不同(引數型別不同,引數個數不同)

綜上所述,預設和過載沒有關係!

2.1 int和char怎麼區分

int ADD(int left = 10, int right = 20) {
	return left + right;
}
char ADD(char left, char right) {
	return left + right;
}
int main() {
	cout << ADD() << endl;
	//cout << ADD(1,2) << endl;	//(1,2)字面量常數,
	//預設給十進位制,十六進位制等等,給的整形預設算常數
	//如果呼叫char
	cout << ADD('1', '2') << endl;	//char型別列印,自動按%c,字元型別→	→	→	→	→	↓
	//傳字元才呼叫char型別的																↓
	//																					↓
	//char型別的字元只是顯示錶面,深入剖析的話在記憶體中,它儲存在4byte中,是它對應的ASCII碼值	↓
	//ASCII碼值還是整形,只不過是1byte													↓
	//char型別存的值是‘49',‘50'.	←	←	←	←	←	←	←	←	←	←	←	←	←	←		
	//對應的是c。c在ASCII碼值中是99	←	←	←	←	←	←	←	←	←	←	←	←	←	←
	return 0;
}

總結:

1.char和int都是表示整形的,整形一般都是用來表示大小,只不過int是4byte,char是1byte

2.char的1byte是用來表示ASCII碼值的字母,多個字母可以表示英文,就能表示文字了

2.2 傳值

有三個值,但是預設了一個,傳的時候只傳了兩個

void lost(int a, int b, int c = 1) {
}
void lost(int a, int b) {
}
//以上構成函數過載,函數名相同,引數或者個數不同 
int main() {
	lost(1, 2, 3);
	lost(1,2);
	//↑是編不過去的,
	return 0;
}

總結:

1. 有多個過載函數“lost”範例與參數列匹配

2. 編譯器不能識別要呼叫哪一個“lost”對過載函數的呼叫不明確

3. 構成過載但是呼叫的時候埋了一個坑

到此這篇關於C++淺析函數過載是什麼的文章就介紹到這了,更多相關C++函數過載內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com