日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > c/c++ >内容正文

c/c++

C++ primer第六章6.4函数的学习 之函数的重载

發(fā)布時(shí)間:2023/12/13 c/c++ 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++ primer第六章6.4函数的学习 之函数的重载 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

6.4 函數(shù)的重載

  • 函數(shù)的名字相同但是形參的列表不同,將其稱之為重載函數(shù)
void print(const char *cp); void print(const int *beg,const int * end); void print(const int ia[],size_t size);
  • 形如上面所展現(xiàn)的這樣,當(dāng)調(diào)用這些函數(shù)的時(shí)候,編譯器會(huì)根據(jù)傳遞的實(shí)參類型推斷出想要的是哪個(gè)函數(shù)。
  • 重載函數(shù)在一定程度上減輕了程序員對(duì)于起名字和記名字的負(fù)擔(dān)。
  • mian函數(shù)不可以重載

定義承載函數(shù)

  • 比如數(shù)據(jù)庫(kù)的應(yīng)用場(chǎng)景中,定義一個(gè)查詢的函數(shù),對(duì)于手機(jī)號(hào)、名字、賬戶號(hào)碼分別進(jìn)行查詢。他們雖然查詢的東西不一樣,但是函數(shù)的名字是一樣的,編譯器會(huì)根據(jù)傳入的實(shí)參的類型決定調(diào)用哪一個(gè)函數(shù)。
  • 對(duì)于重載函數(shù)而言,應(yīng)該在形參的數(shù)量、類型有所不同。
  • 不允許兩個(gè)函數(shù)除了返回的類型不同,形參列表都相同。那么第二個(gè)聲明是錯(cuò)誤的。

判斷兩個(gè)形參的類型是否不同

  • 有時(shí)候兩個(gè)形參列表看起來(lái)不一樣,但是實(shí)際上是相同的
//每隊(duì)聲明的是同一個(gè)函數(shù) record lookup(const Account &acct); record lookup(const Account &); //省略了形參的名字 typedef Phone Telno; record lookup(const Phone&); record lookup(const Telno&); //Phone Telno類型一樣

重載和const形參

  • 頂層const不影響傳入函數(shù)的對(duì)象。一個(gè)擁有頂層const的形參無(wú)法和一個(gè)沒(méi)有頂層const的形參區(qū)分開(kāi)來(lái)。
record lookup(Phone); record lookup(const Phone);//重復(fù)聲明 record lookup(Phone*); record lookup(Phone* const);//重復(fù)聲明
  • 如果形參是某種類型的指針或者引用,則通過(guò)區(qū)分其指向的是常量對(duì)象還是非常量對(duì)象實(shí)現(xiàn)函數(shù)的重載,這個(gè)時(shí)候const是底層
//對(duì)于接受引用或者指針的函數(shù)而言,對(duì)象是常量還是非常量對(duì)應(yīng)的形參不同 //定義了四個(gè)獨(dú)立的重載函數(shù) record lookup(Account&);//函數(shù)作用于Account的引用 record lookup(const Account&);//新函數(shù),作用于常量的引用 record lookup(Account*);//新函數(shù),函數(shù)作用于Account的指針 record lookup(const Account*);//新函數(shù),作用于指向常量的指針
  • 編譯器可以通過(guò)實(shí)參是否是常量來(lái)推斷調(diào)用哪個(gè)函數(shù)。因?yàn)閏onst不可以轉(zhuǎn)化成其他的類型,所以只可以將const對(duì)象(指向const的指針)傳遞給const的形參。
  • 非常量可以轉(zhuǎn)化成const,所以上面的四個(gè)函數(shù)都能作用于非常量對(duì)象或者指向非常量對(duì)象的指針。當(dāng)傳遞一個(gè)非常量對(duì)象或者非常量對(duì)象的指針的時(shí)候,編譯器會(huì)優(yōu)先選用非常量版本的函數(shù)。

建議:何時(shí)不應(yīng)該使用重載函數(shù)

  • 最好用于指向那些確實(shí)非常相似的操作

const_cast和重載

  • 先前
//跳出兩個(gè)string對(duì)象中較短的那個(gè),并且返回其引用 const string &shorterString(const string &s1,const string &s2){return s1.size() < s2.size() ? s1 : s2; }
  • 引入一個(gè)新的函數(shù),相較于先前的函數(shù),當(dāng)他的實(shí)參不是常量的時(shí)候,得到的結(jié)果是一個(gè)普通的引用,使用const_cast就可以實(shí)現(xiàn)這一點(diǎn)。
  • 改進(jìn)
string &shorterString(string &s1,string &s2){auto &r = shorterString(const_cast<const string&>(s1),const_cast<string&>(s2));return const_cast<string&>(r); }int main(){string s1 = "Hello";string s2 = "Hello World";cout << shorterString(s1,s2) << endl;}
  • 改進(jìn)是在先前的基礎(chǔ)上進(jìn)行封裝了一層,里面還是調(diào)用了先前的版本。
  • 改進(jìn)的版本,首先是將他的實(shí)參強(qiáng)制類型轉(zhuǎn)化成對(duì)于const的引用,然后調(diào)用了先前的版本,由先前的版本返回對(duì)于const string的引用,這個(gè)引用事實(shí)上綁定在某個(gè)函數(shù)初始的非常量的實(shí)參上。因此,可以再次將其轉(zhuǎn)化成一個(gè)普通的string&,這個(gè)過(guò)程顯然是安全的。

調(diào)用重載的函數(shù)

  • 在對(duì)于重載的函數(shù)進(jìn)行使用的過(guò)程需要一個(gè)函數(shù)匹配的的過(guò)程,這個(gè)過(guò)程是把函數(shù)的調(diào)用和一組重載函數(shù)中的某一個(gè)關(guān)聯(lián)起來(lái),函數(shù)的重載也叫重載確定。
  • 編譯器會(huì)根據(jù)調(diào)用的實(shí)參與重載集合中的每一個(gè)函數(shù)的形參進(jìn)行匹配,然后根據(jù)比較的結(jié)果決定到底使用哪個(gè)函數(shù)
  • 但是有些情形,對(duì)于重載函數(shù)的比較會(huì)很難,比如,當(dāng)兩個(gè)重載函數(shù)參數(shù)的數(shù)量相同和參數(shù)的類型可以相互轉(zhuǎn)化的時(shí)候。

匹配的結(jié)果

  • 1,編譯器找到一個(gè)與實(shí)參最佳匹配的函數(shù),并生成調(diào)用這個(gè)函數(shù)的代碼。
  • 2,找不到一個(gè)函數(shù)和調(diào)用的實(shí)參相互匹配,此時(shí)編譯器會(huì)提示無(wú)匹配的錯(cuò)誤
  • 3,對(duì)于一個(gè)函數(shù)可以匹配,但是每一個(gè)都不是最佳的選擇,這個(gè)時(shí)候也是錯(cuò)誤,稱為二義性調(diào)用。

6.4.1 重載和作用域

  • 重載對(duì)于函數(shù)的作用域并沒(méi)有什么特別的改變,如果在內(nèi)層作用域中聲明名字,它將隱藏外層作用域中聲明的同名的實(shí)體。在不同的作用域中無(wú)法重載函數(shù)的名字。
  • 原則:將函數(shù)的聲明置于局部的作用域之內(nèi)不是一個(gè)明智的決定,這里僅僅為了舉例子
void print(const string &); void print(double );//重載print函數(shù) void fooBar(int ival){ // bool read = false; //新的作用域:隱藏外層的read,如果把這一行注釋掉,那么string s = read();就不會(huì)出錯(cuò)string s = read(); //如果上面一行存在,會(huì)出錯(cuò),因?yàn)閞ead是一個(gè)布爾值,而不是函數(shù)cout << s << endl; } int main(){fooBar(1); }

?

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

總結(jié)

以上是生活随笔為你收集整理的C++ primer第六章6.4函数的学习 之函数的重载的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。