C++函數(shù)重載代碼如下
成都創(chuàng)新互聯(lián)公司專注于蘭坪企業(yè)網(wǎng)站建設(shè),成都響應(yīng)式網(wǎng)站建設(shè)公司,商城網(wǎng)站建設(shè)。蘭坪網(wǎng)站建設(shè)公司,為蘭坪等地區(qū)提供建站服務(wù)。全流程按需搭建網(wǎng)站,專業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,成都創(chuàng)新互聯(lián)公司專業(yè)和態(tài)度為您提供的服務(wù)
#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調(diào)用可以實(shí)現(xiàn)不同的目標(biāo)函數(shù)調(diào)用
什么是函數(shù)重載?
一組函數(shù),函數(shù)名稱相同,函數(shù)參數(shù)個(gè)數(shù),或者類型不同,那么這一組函數(shù)就叫做函數(shù)重載。
同時(shí)要注意一組函數(shù)要形參重載,一定要處在一個(gè)作用域當(dāng)中.
一組函數(shù),函數(shù)名相同,函數(shù)列表也相同,返回值不同,不構(gòu)成函數(shù)重載.
問題1:
為什么C++支持函數(shù)重載而C不支持函數(shù)重載?
C++代碼在編譯的過程中,函數(shù)名產(chǎn)生函數(shù)符號(hào)的時(shí)候,規(guī)則是函數(shù)名+函數(shù)列表組成 (符號(hào)表產(chǎn)生類似 compare_int_int ,compare_double_double ,compare_char)
而C代碼在編程的時(shí)候,函數(shù)名產(chǎn)生的函數(shù)符號(hào)只由函數(shù)名決定,所以如果函數(shù)名相同,鏈接的時(shí)候會(huì)報(bào)重名錯(cuò)誤.
問題2:
const 對(duì)函數(shù)重載有什么影響,如下代碼
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;
}
上面程序編譯無法通過,報(bào)錯(cuò)“函數(shù)function(int i)已經(jīng)有主體” 所以對(duì)于編譯器看來function(int i) 和 function(const int i)是一樣的,
我們通過打印 typeid(a).name() 和 typeid(b).name()驗(yàn)證,打印出來都是int,同時(shí)根據(jù)C++編譯器在編譯過程中生成函數(shù)符號(hào)的規(guī)則是函數(shù)名+函數(shù)列表,所以function(int i)和function(const int i)生成的函數(shù)符號(hào)就是一樣的了.
void function(int * a){}
void function(const int * a){}
上面兩行的重載函數(shù)能夠正常編譯通過
void function(int *a){}
void function(int * const a){}
上面兩行重載函數(shù)無法正常編譯通過
函數(shù)重載屬于多態(tài)的一種形式, 多態(tài)=》靜態(tài)多態(tài) + 動(dòng)態(tài)多態(tài), 函數(shù)重載屬于靜態(tài)多態(tài),編譯期多態(tài),函數(shù)重載的調(diào)用在編譯期就確定了調(diào)用哪個(gè)函數(shù)
問題3:
C和C++的調(diào)用問題
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;
}
編譯的時(shí)候,報(bào)鏈接錯(cuò)誤 “無法解析的外部符號(hào) int _cdel1 sum(int,int)” 為什么會(huì)報(bào)著錯(cuò)?
因?yàn)?br>
test.c 程序
int sum(int a , int b){
return a + b;
}
經(jīng)過編譯器生成的函數(shù)符號(hào) 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); 經(jīng)過編譯器生成的函數(shù)符號(hào) sum_int_int(int,int) UND ,
所以鏈接的時(shí)候,編譯器需要找到 sum_int_int(int,int) 來替換UND, 但是發(fā)現(xiàn)找不到.
怎么解決? 通過 “extern C”
test2.cpp程序
extern "C"
{
int sum(int a, int b);
}
int main(){
int ret=sum(10,20);
return ret;
}
這個(gè)時(shí)候C++編譯器在看到 extern "C" {int sum (int a, int b);}的時(shí)候,就會(huì)按照C的規(guī)則生產(chǎn)函數(shù)符號(hào).
反過來,如果C調(diào)用C++ 則如下處理
test.cpp 程序
extern "C"{
int sum(int a , int b){
return a + b;
}
}
經(jīng)過編譯器生成的函數(shù)符號(hào) 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++編譯器中內(nèi)置的宏定義,如果上面代碼在C++編譯器環(huán)境下編譯,
那么
#ifdef __cplusplus
extern "C"
#endif
#ifdef __cplusplus
}
#endif
網(wǎng)站標(biāo)題:<三>詳解函數(shù)重載
鏈接URL:http://chinadenli.net/article6/dsoieig.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App設(shè)計(jì)、微信公眾號(hào)、網(wǎng)站維護(hù)、手機(jī)網(wǎng)站建設(shè)、企業(yè)建站、網(wǎng)站策劃
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容