第八章 函數(shù)探幽

C++內(nèi)聯(lián)函數(shù)

要使用這種特性,必須采取下述措施之一:

在函數(shù)聲明錢加上關(guān)鍵字inline;

在函數(shù)定義錢加上關(guān)鍵字inline。

內(nèi)聯(lián)函數(shù)和常規(guī)函數(shù)一樣,也是值傳遞參數(shù)。

引用變量

引用是已定義的變量的別名。通過將引用變量用作參數(shù),函數(shù)將使用原始數(shù)據(jù),而不是其副本。

C++給&符號賦予了弄一個含義,將其用來聲明引用。

必須在聲明引用變量時進(jìn)行初始化。引用更接近c(diǎn)onst指針,必須在創(chuàng)建時進(jìn)行初始化,一旦與某個變量關(guān)聯(lián)起來,就一直效忠于他。也就是說:

int & rodents =rats;實(shí)際上是下述代碼的偽裝表示:

int *const pr =&rats;

其中,引用rodents扮演的角色與表達(dá)式*pr相同

將引用用作函數(shù)參數(shù)

這種傳遞參數(shù)的方法稱為按引用傳遞。按引用傳遞允許被調(diào)用的函數(shù)能夠訪問調(diào)用函數(shù)中的變量。

引用的屬性和特別之處

如果程序員的意圖是讓函數(shù)使用傳遞給他的信息,而不對這些信息進(jìn)行修改,同時又想用引用,則應(yīng)使用常量引用 應(yīng)該在函數(shù)頭和函數(shù)原型中使用const 例如 const double &ra 如果這樣做,當(dāng)編譯器發(fā)現(xiàn)代碼修改了ra的值時,將生成錯誤信息。

對于形參&x 在實(shí)參處不可以使用表達(dá)式會出現(xiàn)警告這時會使用一個臨時變量等于表達(dá)式的值進(jìn)行傳遞 實(shí)參應(yīng)該是變量 而如果是形參是x 則可以。

如果實(shí)參與引用參數(shù)不匹配,C++將生成臨時變量。當(dāng)前,僅當(dāng)參數(shù)為const引用是,C++才允許這樣做。

什么時候創(chuàng)建臨時變量呢? 如果引用參數(shù)是const 則編譯器將在下面兩種情況下生成臨時變量:

1. 實(shí)參的類型正確,但不是左值;

2. 實(shí)參的類型不正確,但可以轉(zhuǎn)換為正確的類型。

左值是什么呢?左值參數(shù)是可被引用的數(shù)據(jù)對象,例如,變量、數(shù)組元素、結(jié)構(gòu)成員、引用和解除引用的指針都是左值。非左值包括字面常量(用括號括起的字符串除外,它們由其地址表示)和包含多項(xiàng)的表達(dá)式。

double refcube(const double *ra)

double side=7.0;

long edge =5L;

例如 refcube(7.0)// refcube(side+10.0)//refcube(edge)

在這種情況下,編譯器都將生成一個臨時匿名變量,并讓ra指向它。這些臨時變量只在函數(shù)調(diào)用期間存在,此后編譯器便可以隨意將其刪除。

實(shí)際上對于形參為const引用的C++函數(shù),如果實(shí)參不匹配,則其行為類似于按值傳遞,為確保原始數(shù)據(jù)不被修改,將使用臨時變量來儲存值。

應(yīng)盡可能使用const

1.使用const可以避免無意中修改數(shù)據(jù)的編程錯誤;

2.使用const使函數(shù)能夠正確生成并使用臨時變量;

3.使用const引用使函數(shù)能夠正確生成并確定臨時變量。

右值引用 使用&&。

將引用用于結(jié)構(gòu)

返回引用最重要的一點(diǎn)是,應(yīng)避免返回函數(shù)終止時不再存在的內(nèi)存單元引用。

對象、繼承和引用

C++對象及類可見http://www.runoob.com/cplusplus/cpp-classes-objects.html

C++繼承詳情可見http://www.runoob.com/cplusplus/cpp-inheritance.html

默認(rèn)參數(shù)

對于帶參數(shù)列表的函數(shù),必須從右向左添加默認(rèn)值。也就是說,要為某個參數(shù)設(shè)置默認(rèn)值,則必須為它右邊的所有參數(shù)提供默認(rèn)值:

int chico(int n;int m=12;int t); //錯誤

實(shí)參按從左到右的順序依次賦給相應(yīng)的形參,而不能跳過任何參數(shù)。因此,下面的調(diào)用是不允許的:

beep= chico(3, ,2); // 錯誤

函數(shù)重載

函數(shù)多態(tài)是C++在C語言的基礎(chǔ)上新增的功能。默認(rèn)參數(shù)讓您能夠適用不同數(shù)目的參數(shù)調(diào)用同一個函數(shù),而函數(shù)多態(tài)(函數(shù)重載)讓您能夠使用多個同名的函數(shù)。

函數(shù)重載的關(guān)鍵是函數(shù)的參數(shù)列表——也稱為函數(shù)特征標(biāo)。

編譯器在檢查函數(shù)特征標(biāo)時,將把類型引用和類型本身視為一個特征標(biāo)。

函數(shù)重載不應(yīng)亂用,僅當(dāng)函數(shù)基本上執(zhí)行相同的任務(wù),但使用不同形象的數(shù)據(jù)時,才應(yīng)采用函數(shù)重載。

名稱修飾...

函數(shù)模板

函數(shù)模板是通用的函數(shù)描述,也就是說,他們使用泛型來定義函數(shù),其中的泛型可用具體的類型替換。由于模板允許以泛型的方式編寫程序,因此有時也被稱為通用變成。由于類型是用餐食表示的,因此模板特性有事也被稱為參數(shù)化類型。

template<typename AnyType>

void Swap(AnyType &a,AnyType &b)

要建立模板 template 是必須的 而 在C++98添加關(guān)鍵字typename之前 可用class創(chuàng)建模板

重載的模板

并非所有模板參數(shù)都必須是模板參數(shù)類型,和常規(guī)重載一樣,被重載的模板函數(shù)特征標(biāo)必須不同。

顯式具體化

template <> void Swap <job> (job&,job&);

<job>是可選的,因?yàn)楹瘮?shù)參數(shù)類型表明,這是job的一個具體化。

如果有多個原型,在編譯器選擇原型時,非模板版本優(yōu)先于顯式具體化和模板版本,而顯式具體化優(yōu)先于使用模板生成的版本。

實(shí)例化和具體化

為進(jìn)一步了解模板,必須理解屬于實(shí)例化和具體化。記住,在代碼中包含函數(shù)模板本身并不會生成函數(shù)定義,他只是一個用于生成函數(shù)定義的方案。編譯器使用模板為特定類型生成函數(shù)定義時,得到的是模板實(shí)例。模板并非函數(shù)定義,但使用int的模板實(shí)例是函數(shù)定義。這種實(shí)例化方式被稱為隱式實(shí)例化,因?yàn)榫幾g器之所以知道需要進(jìn)行定義,是由于程序調(diào)用函數(shù)是提供了參數(shù)。

顯示實(shí)例化

template void Swap<int>(int ,int );

實(shí)現(xiàn)了這種特性的編譯器看到上述聲明后,將使用Swap()模板生成一個使用int類型的實(shí)例。也就是說,該聲明的意思是“使用Swap()模板生成int類型的函數(shù)定義?!?/b>

與顯式實(shí)例化不同的是,顯式具體化使用下面兩個等價的聲明之一:

template <> void Swap <int> (int&,int&);

template <> void Swap (int&,int&);

區(qū)別在于,這些聲明的意思是“不要使用Swap()模板來生成函數(shù)定義,而應(yīng)使用專門為int類型顯式地定義的函數(shù)定義”。這些原型必須有自己的函數(shù)定義。顯式具體化聲明在關(guān)鍵字template后包含<>,而顯式實(shí)例化沒有。

https://blog.csdn.net/sunxiwang/article/details/78667444

http://blog.sina.com.cn/s/blog_612ec26f0102w2wg.html

試圖在同一個文件(或轉(zhuǎn)換單元)中使用同一種類型的顯式實(shí)例和顯式具體化將出錯。

https://bbs.csdn.net/topics/390559301

https://bbs.csdn.net/topics/380250382

重載解析

https://blog.csdn.net/y1196645376/article/details/52860006

(完)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容