解析C++老手也會(huì)出現(xiàn)的問題
對(duì)于剛剛接觸到C++的用戶來說,C++確實(shí)擁有比別的開發(fā)語言更復(fù)雜的問題, 學(xué)習(xí)C++時(shí)應(yīng)該注意由易至難,循序漸進(jìn),要成為C++老手,不是那么容易的,必須要花很大的努力。
如:const int a;和int const b;中,雖然兩種具有相同的意義,但是最好利用后面的那種情況,后面的更加可讀,因?yàn)椋篿nt const我們可以很清楚地看到const是修飾int,而前面的那種方法中,我們就不那么輕易知道到底const 的具體涵義。由后面的那種方法我們可以知道const指一個(gè)恒定的整形。Int *const b,指的是一個(gè)恒定的指針b,這個(gè)指針指向一個(gè)整型。
所以這個(gè)指針的內(nèi)容可以改變,但是它的指針值也就是b的值不能變,相應(yīng)的int const *b,指的是一個(gè)指向恒定整型內(nèi)容的指針b,也就是說這個(gè)b的內(nèi)容可以變,但是開始的b所指向的地址中的內(nèi)容不能在程序當(dāng)中通過b來改變。volatile對(duì)上面的原則也適用,使用類型T做為類型變量已經(jīng)作為了模板參數(shù)的慣例,用來表示函數(shù)或者類所接受的類型參量可以用所有的類型。#t#
在C++的模板的類型參量前,最好盡量使用typename來代替class。在編譯時(shí)期,模板被編譯兩次;實(shí)例化之前:檢查模板代碼本身,查看語法是否正確;在實(shí)例化期間,檢查模板代碼,查看是否所有的調(diào)用都有效。
當(dāng)使用函數(shù)模板,并且引發(fā)模板實(shí)例化的時(shí)候,編譯器需要查看模板定義。在函數(shù)實(shí)參的類型的推導(dǎo)中,如果類型出現(xiàn)不匹配現(xiàn)象則會(huì)出現(xiàn)編譯錯(cuò)誤。如果要解決這編譯錯(cuò)誤則有以下幾種方法解決:對(duì)傳入的實(shí)參進(jìn)行類型轉(zhuǎn)換成匹配類型后傳入。顯示指定模板函數(shù)的全特化(不能為偏特化,因?yàn)楹瘮?shù)不支持偏特化)類型。
例子如下所示:
- template < typename T >
- T & max(T & value1,T & value2)
- {
- return value1 > value2 ? value1:value2;
- }
- 調(diào)用max( 3 , 4.1 )會(huì)出現(xiàn)編譯錯(cuò)誤,解決的辦法:
- 1 .max(static_cast < double > ( 3 ), 4.1 );
- 2 .max < double > ( 3 );
- 3 .將函數(shù)的模板參數(shù)從一個(gè)改為兩個(gè)。
在模板函數(shù)內(nèi)部不能指定默認(rèn)的模板參數(shù)。函數(shù)不能采用偏特化的方法來實(shí)現(xiàn)類型的遞歸,但是它可以利用函數(shù)重載的方法來實(shí)現(xiàn)類型的轉(zhuǎn)換。相對(duì)于8而言類能使用偏特化的方法來實(shí)現(xiàn)類型的遞歸。
并且它的仿函數(shù)也可以使用重載operator()來實(shí)現(xiàn)函數(shù)重載方法。但是它的一個(gè)問題就是在調(diào)用仿函數(shù)的時(shí)候一定要加上它的實(shí)例化參數(shù)類型,以及調(diào)用它的構(gòu)造函數(shù)。函數(shù)調(diào)用的時(shí)候可以采用由參數(shù)的類型來反推函數(shù)的模板參數(shù),這是仿函數(shù)所不能的。所以我們?cè)诰幊痰倪^程當(dāng)中一定要注意這些不同技術(shù)之間的優(yōu)點(diǎn)和不足,看看哪些更適合我們。
在調(diào)用非標(biāo)準(zhǔn)函數(shù)的時(shí)候最好要與調(diào)用標(biāo)準(zhǔn)函數(shù)區(qū)分開來,這樣不致于使用程序產(chǎn)生歧義的錯(cuò)誤。做法是:在變量或者函數(shù)的前面加上全局標(biāo)識(shí)符。