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

歡迎訪問 默认站点!

默认站点

當(dāng)前位置: 首頁 >

《C++ Primer 第五版》(第6.3~6.7节)——返回指向数组/函数的指针,函数重载,默认形参、inline函数和constexpr函数

發(fā)布時(shí)間:2023/11/30 30 豆豆
默认站点 收集整理的這篇文章主要介紹了 《C++ Primer 第五版》(第6.3~6.7节)——返回指向数组/函数的指针,函数重载,默认形参、inline函数和constexpr函数 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1.返回指向數(shù)組/函數(shù)的指針

? ? ? ? ? ?顧名思義,就是函數(shù)返回值為指向數(shù)組/函數(shù)的指針

? ? ? ? ? ?數(shù)組的性質(zhì):不能被拷貝,函數(shù)也不能返回?cái)?shù)組。但可以返回?cái)?shù)組指針/引用,聲明一個(gè)返回?cái)?shù)組指針的函數(shù),有四種方式,一種是直接聲明,格式為:

? ? ? ? ? ? ? ? ? ? ? ? ? int? (*func(int i) [10];? ?//函數(shù)聲明

? ? ? ? ? 第二種是使用using/typedef類型別名來簡化:

? ? ? ? ? ? ? ? ? ? ? ? ? ? ?typedef? int? arr[10];? /using arr=int[10];? ? ? //定義類型別名和數(shù)組等效

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? arr?*func(int i);? //函數(shù)聲明

? ? ? ? ? 第三種是采用C++11提供的尾后返回類型的方式來聲明數(shù)組指針,具體格式如下:

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?auto func(int i)? -> int(*)[10];

? ? ? ? ? 第四種是知道數(shù)組指針指向那種類型的數(shù)組情況下,可以采用decltype獲得數(shù)組類型(decltype,sizeof,typeid不會(huì)讓數(shù)組退化為指針),具體格式如下:

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?int array[10] = { 0 };

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?decltype(array) *func(int i);

? ? ? ? ?函數(shù)指針是采用需要聲明的指針名替換函數(shù)名來完成函數(shù)指針的聲明,函數(shù)指針由函數(shù)的返回值參數(shù)列表類型共同決定。其聲明、賦值和調(diào)用如下所示:

? ? ? ? ? ? ? ? bool LengthCompare(const string & , const string &);? ?//函數(shù)聲明

? ? ? ? ? ? ? ? bool(*pf)(const string & , const string &);? ? ? ? ? ? ? ?//函數(shù)指針聲明

? ? ? ? ? ? ? ? ? ? ? pf=LengthCompare;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //函數(shù)指針賦值

? ? ? ? ? ? ? ? ? ? ? pf=&LengthCompare;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //函數(shù)指針賦值

? ? ? ? ? ? ? ? bool b1 = pf("hello”,“good”);? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//直接調(diào)用,等價(jià)于bool b3=LengthCompare("hello”,“good”);

? ? ? ? ? ? ? ? bool b2 = (*pf)("hello”,“good”);? ? ? ? ? ? ? ? ? ? ? ?//解引用調(diào)用

? ? ? ? 函數(shù)指針作為C語言的半壁江山,其可以作為函數(shù)的形參,來實(shí)現(xiàn)一類函數(shù)的功能,從來增加代碼的魯棒性。具體代碼如下:

void usebigger(const string &s1,const string&s2, bool pf(const string &,const string &));//函數(shù)指針做形參,pf替換為(*pf)一樣

? ? ? ? 使用using/typedef可以簡化上述的過程,具體代碼如下:

?typedef bool func(const string &,const string&)/typedef decltype(LengthCompare) funcz;//聲明func/funcz為函數(shù)類型;

typedef bool (*funcp)(const string &,const string&)/typedef decltype(LengthCompare)? *funcp2;//聲明funcp/funcp2函數(shù)指針類型?

void usebigger(const string&,const string&,func/funcp2);//函數(shù)形參為函數(shù)指針,函數(shù)名做形參時(shí)可做函數(shù)指針用

? ? ? ? 另外函數(shù)指針也可以作為返回值使用,具體形式為:

? ? ? ? ? ? ? ?int (* f1(int) )(int * ,? int); //聲明一個(gè)函數(shù)指針,數(shù)指針指向的是一個(gè)參數(shù)列表為int*和int,返回值為int的函數(shù)。

? ? ? ?使用尾置返回類型的方式聲明一個(gè)返回函數(shù)指針的函數(shù),格式為:

? ? ? ? ? ? ? auto f1(int)? -> int (*)(int * , int);

2.函數(shù)重載

? ? ? ? ? 函數(shù)重載的條件:相同作用域,同名函數(shù),不同參數(shù)列表。其中返回類型和參數(shù)列表中的頂層const不能作為函數(shù)重載的依據(jù)。如果同名函數(shù)不在同一作用域內(nèi),但在同一個(gè)文件中,則屬于函數(shù)覆蓋

? ? ? ? ? 重載函數(shù)調(diào)用時(shí),如有多個(gè)函數(shù)滿足,則優(yōu)先考慮不用隱式轉(zhuǎn)換的版本。

? ? ? ? ? const_cast可以用于改變運(yùn)算對(duì)象的底層const屬性,可以用于增加const屬性或者去除const屬性,這里很容易理解錯(cuò)說const_cast只能用于去除原因?qū)ο蟮腸onst屬性,《C++ Primer 第五版》p209的例子可以看出const_cast的另外一種用法。

? ? ? ? ?在查找const_cast相關(guān)博客介紹過程中,無意之間發(fā)現(xiàn)了一個(gè)程序中的專業(yè)名詞“常量折疊”,具體意思在編譯期間簡化常量表達(dá)式的一個(gè)過程,簡單來說就是將常量表達(dá)式計(jì)算求值,并對(duì)求得的值來替換表達(dá)式,放入常量表中,具體詳細(xì)的情況可參考博客:https://blog.csdn.net/it_wjw/article/details/86668302

3.默認(rèn)形參、inline函數(shù)和constexpr函數(shù)

? ? ? ? ?函數(shù)的默認(rèn)形參就是在調(diào)用時(shí)函數(shù)可以不給實(shí)參,此時(shí)函數(shù)的形參采用默認(rèn)參數(shù)值,多用于某些函數(shù)參數(shù)值固定的情況。默認(rèn)形參之后就不能再出現(xiàn)需要初始化的形參

? ? ? ? ?內(nèi)聯(lián)函數(shù)(inline函數(shù))用于優(yōu)化規(guī)模較小、流程直接、使用頻繁的函數(shù),使用內(nèi)聯(lián)函數(shù)能夠省去函數(shù)的出入棧過程和參數(shù)的拷貝過程,但是inline只是對(duì)編譯器的一個(gè)請求,編譯器可以忽略這個(gè)請求。inline函數(shù)的實(shí)質(zhì)是在調(diào)用函數(shù)的地方直接把函數(shù)替換調(diào)用函數(shù)。

? ? ? ? constexpr函數(shù):通常用于常量表達(dá)式的函數(shù)(通常會(huì)被隱式inline化)。要求:返回類型和形參類型(應(yīng)該是實(shí)參的帶入值)都是字面值常量;函數(shù)體有且僅有一條return語句;函數(shù)體中的語句在運(yùn)行時(shí)不執(zhí)行任何操作。

? ? ? ? ?由于inline和constexpr函數(shù)都屬于函數(shù)調(diào)用時(shí)直接將函數(shù)體和調(diào)用函數(shù)替換的情形,因此inline和constexpr函數(shù)應(yīng)該講定義放在頭文件中,另外這兩種函數(shù)可以在多個(gè)文件中重復(fù)定義,但必須保證多個(gè)定義完全相同**新知識(shí)點(diǎn)

4.調(diào)試代碼工具

? ? ? ? ? assert(斷言,頭文件在cassert中);用于輔助驗(yàn)證不可能發(fā)生的事情。assert括號(hào)中的條件為真,則對(duì)程序無影響,否則程序停止運(yùn)行。

? ? ? ? ? NDENUG 預(yù)處理變量,如果定義了這個(gè)預(yù)處理變量,不執(zhí)行assert,沒有定義這個(gè)預(yù)處理變量,則執(zhí)行assert(默認(rèn))。

? ? ? ? ? 預(yù)處理器提供5個(gè)預(yù)處理器定義的程序調(diào)試名字:

? ? ? ? ? ? ? ? ? ? ? ?_ _ func _ _:輸出當(dāng)前調(diào)試函數(shù)的名字

? ? ? ? ? ? ? ? ? ? ? ?_ _ FILE _ _:輸出當(dāng)前文件名的字符串字面值

? ? ? ? ? ? ? ? ? ? ? ?_ _ LINE _ _:輸出當(dāng)前行號(hào)的整型字面值

? ? ? ? ? ? ? ? ? ? ??_ _ TIME _ _:輸出當(dāng)前文件編譯時(shí)間的字符串字面值

? ? ? ? ? ? ? ? ? ? ? _ _ DATE?_ _:輸出當(dāng)前文件編譯日期的字符串字面值

總結(jié)

以上是默认站点為你收集整理的《C++ Primer 第五版》(第6.3~6.7节)——返回指向数组/函数的指针,函数重载,默认形参、inline函数和constexpr函数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得默认站点網(wǎng)站內(nèi)容還不錯(cuò),歡迎將默认站点推薦給好友。