欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

<三>詳解函數(shù)重載

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ù)

點(diǎn)擊查看代碼
#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;
}

更常見的寫法

點(diǎn)擊查看代碼
#ifdef __cplusplus 
 extern "C" 
 #endif
  int sum(int a,int b){return a+b;}
 #ifdef __cplusplus
   }
 #endif

_cplusplus 是C++編譯器中內(nèi)置的宏定義,如果上面代碼在C++編譯器環(huán)境下編譯,
那么

點(diǎn)擊查看代碼
 #ifdef __cplusplus
  extern "C"
  #endif
  #ifdef __cplusplus
  }
  #endif
被激活,被編譯生產(chǎn)的函數(shù)名是C風(fēng)格的 如果在c編譯器環(huán)境下編譯,#ifdef 未被激活,函數(shù)被編譯生成的函數(shù)名仍然是C風(fēng)格的. 更通用.

網(wǎng)站標(biāo)題:&lt;三&gt;詳解函數(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)

綿陽服務(wù)器托管