C++函式多載代碼如下
點擊查看代碼
#include <iostream>
using namespace std;
bool compare(int a,int b){
cout<<"compare_int_int"<<endl;
return a>b;
}
bool compare(){
cout<<"compare_double_double"<<endl;
return a>b;
}
bool compare(const char * a ,const char * b){
cout<<"compare_char*_char*"<<endl;
return strcmp(a,b)>0;
}
int main(){
bool b1=compare(10,20);
bool b2=compare(100.0,200.0);
bool b3=compare("abc","def");
return 0;
}
上面的compare呼叫可以實作不同的目標函式呼叫
什么是函式多載?
一組函式,函式名稱相同,函式引數個數,或者型別不同,那么這一組函式就叫做函式多載,
同時要注意一組函式要形參多載,一定要處在一個作用域當中.
一組函式,函式名相同,函式串列也相同,回傳值不同,不構成函式多載.
問題1:
為什么C++支持函式多載而C不支持函式多載?
C++代碼在編譯的程序中,函式名產生函式符號的時候,規則是函式名+函式串列組成 (符號表產生類似 compare_int_int ,compare_double_double ,compare_char)
而C代碼在編程的時候,函式名產生的函式符號只由函式名決定,所以如果函式名相同,鏈接的時候會報重名錯誤.
問題2:
const 對函式多載有什么影響,如下代碼
void function(int i){}
void function(const int i){}
int main(){
int a=10;
cont int b=20;
cout<<typeid(a).name()<<endl;
cout<<typeid(b).name()<<endl;
}
上面程式編譯無法通過,報錯“函式function(int i)已經有主體” 所以對于編譯器看來function(int i) 和 function(const int i)是一樣的,
我們通過列印 typeid(a).name() 和 typeid(b).name()驗證,列印出來都是int,同時根據C++編譯器在編譯程序中生成函式符號的規則是函式名+函式串列,所以function(int i)和function(const int i)生成的函式符號就是一樣的了.
void function(int * a){}
void function(const int * a){}
上面兩行的多載函式能夠正常編譯通過
void function(int *a){}
void function(int * const a){}
上面兩行多載函式無法正常編譯通過
函式多載屬于多型的一種形式, 多型=》靜態多型 + 動態多型, 函式多載屬于靜態多型,編譯期多型,函式多載的呼叫在編譯期就確定了呼叫哪個函式
問題3:
C和C++的呼叫問題
test.c 程式
int sum(int a , int b){
return a + b;
}
test2.cpp程式
int sum(int a, int b);
int main(){
int ret=sum(10,20);
return ret;
}
編譯的時候,報鏈接錯誤 “無法決議的外部符號 int _cdel1 sum(int,int)” 為什么會報著錯?
因為
test.c 程式
int sum(int a , int b){
return a + b;
}
經過編譯器生成的函式符號 sum(int a,int b)
test2.cpp程式
int sum(int a, int b);
int main(){
int ret=sum(10,20);
return ret;
}
int sum(int a, int b); 經過編譯器生成的函式符號 sum_int_int(int,int) UND ,
所以鏈接的時候,編譯器需要找到 sum_int_int(int,int) 來替換UND, 但是發現找不到.
怎么解決? 通過 “extern C”
test2.cpp程式
extern "C"
{
int sum(int a, int b);
}
int main(){
int ret=sum(10,20);
return ret;
}
這個時候C++編譯器在看到 extern "C" {int sum (int a, int b);}的時候,就會按照C的規則生產函式符號.
反過來,如果C呼叫C++ 則如下處理
test.cpp 程式
extern "C"{
int sum(int a , int b){
return a + b;
}
}
經過編譯器生成的函式符號 sum(int a,int b)
test2.c程式
int sum(int a, int b);
int main(){
int ret=sum(10,20);
return ret;
}
更常見的寫法
點擊查看代碼
#ifdef __cplusplus
extern "C"
#endif
int sum(int a,int b){return a+b;}
#ifdef __cplusplus
}
#endif
_cplusplus 是C++編譯器中內置的宏定義,如果上面代碼在C++編譯器環境下編譯,
那么
點擊查看代碼
#ifdef __cplusplus
extern "C"
#endif
#ifdef __cplusplus
}
#endif
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/520552.html
標籤:C++
