程序員將函數做爲本身的內聯函數時,編譯器不必定會知足這種要求。他可能認爲函數過大或是函數本身調用了本身,或有些編譯器不支持這種特性。ios
若是函數定義佔用多行,做爲內聯函數就不太合適。程序員
必須在聲明引用時將其初始化,而不能先聲明再賦值,一旦它與某個變量關聯起來,就一直效忠於它。算法
當且僅當函數參數爲const引用時,C++在下列狀況下才可能建立臨時變量:express
實參的類型正確,但不是左值(左值是指除不被引號括起的字符串和包含多項的表達式外的可引用的數據對象)編程
實參的類型不正確,但能夠轉換爲正確的類型數組
應儘量的使用const:函數
使用const能夠避免無心中修改數據的編程錯誤spa
使用const使函數可以處理const和非const實參,不然只能接受非const數據指針
使用const引用使函數可以正確生成並使用臨時變量對象
返回引用時,應避免返回指向臨時變量的指針。要避免這種問題,能夠返回一個做爲參數傳遞給函數的引用,也能夠用new來分配新的存儲空間,但當再也不須要new分配的內存時,應使用delete來釋放他們,auto_ptr和C++11新增的unique_ptr模板可幫助程序員完成釋放工做。
setf( )能設置各類格式化狀態,setf(ios_base::fixed)使用定點表示法,方法precision( )指定顯示多少位小數;setf(ios_base:showpoint)顯示小數點,即便小數部分爲0;方法width( )設置下一次輸出操做使用的字段寬度,默認爲0,這種設置只在顯示下一個值時有效,而後恢復到默認。
setf( )返回調用它以前的有效的格式化設置,ios_base::fmtflags是存儲這種信息所需的數據類型名稱,將它做爲參數調用setf( ) ,全部格式化設置恢復到原來的值。
對於使用傳遞的值而不修改的函數:
若是數據對象很小,如內置數據類型或小型結構,則按值傳遞
若是數據對象是數組,則使用指針,將指針聲明爲指向const的指針
若是數據對象是較大的結構,則使用const指針或const引用,以提升程序的效率
若是數據對象是類對象,則使用const引用。
對於修改調用函數中數據的函數:
若是數據對象是內置數據類型,則使用指針。
若是數據對象是數組,則使用指針。
若是數據對象是結構,則使用引用或指針。
若是數據對象是類對象,則使用引用。
對於帶參數列表的函數,必須從右向左添加默認值,也就是說要爲某個參數設置默認值,則必須爲他右邊的全部參數提供默認值。只有原型制定了默認值,函數定義與沒有默認參數時徹底一致。
當函數調用捕魚任何原型匹配時,沒有匹配的原型不會中止使用其中的某個函數,C++會嘗試使用標準類型轉換進行強制分配。當強制轉換後。僅有一個爲惟一的原型,C++將調用,當不僅一個原型時,C++將拒絕這種調用。
編譯器在檢查函數的參數列表時,把類型引用和類型自己視爲同一個參數列表。
若是函數調用存在多個原型匹配,C++將調用最匹配的版本。
若是在須要多個將同一種算法用於不一樣類型的函數時,請使用模板。若是不考慮向後兼容的問題,並願意鍵入較長的單詞,則聲明類型參數時,應使用關鍵字typename而不是class。
並不是全部的模板參數都必須是模板參數類型。
顯示具體化(C++98):
對於給定函數名,能夠有非模板函數、模板函數和顯示具體化函數模板及其重載版本
顯示具體化的原型和定義應以template<>打頭,並經過名稱指出類型,如template<> void swap<int>(int&,int&)或template<> void swap(int&,int&),意思是不要使用swap()模板來生成函數定義,而應使用專門爲int類型顯示定義的函數定義,這些原型必需要有本身的函數定義
非模板函數優先於具體化函數,具體化函數優先於常規模板
顯示實例化:聲明所需的類型——用<>符號表示類型,並在聲明前加上關鍵字,如template void swap<int>(int ,int),意思是使用swap模板生成int類型定義
重載解析:
建立候選函數列表,其中包含與被調用函數名稱相同的函數和模板函數。
使用候選函數列表建立可行函數列表,這些都是函數數目正確的函數,爲此有一個飲食轉換序列,其中包括實參類型與相應的形參類型徹底匹配的狀況。
肯定是否有最佳的可行函數。一般,從最佳到最差的順序:
徹底匹配,常規函數優先於模板
進行徹底匹配時,C++容許某些「可有可無的轉換」:
從實參 | 到形參 |
Type | Type& |
Type& | Type |
Type[ ] | *Type |
Type(argument-list) | Type(*)(argument-list) |
Type | const Type |
Type | volatile Type |
Type * | const Type |
Type * | volatile Type |
重載解析將尋找最匹配的函數。若是隻存在一個這樣的函數,則選擇它;若是有多個匹配的原型,編譯器將沒法完成重載解析的過程;而後有時候,即便兩個函數徹底匹配,仍可完成重載解析。首先,指向非const數據的指針和引用,優先與非const指針和引用參數匹配。一個徹底匹配因爲另外一個的另外一種狀況是,其中一個是模板函數,另外一個不是,在這種狀況下,非模板函數優於模板函數。若是兩個函數都是模板函數,則較具體的模板函數優先,即他須要進行的轉換更少。找出最具體函數的規則被稱爲函數模板的部分排序規則。
提高轉換
標準轉換
用戶定義的轉換
關鍵字decltype(C++11):
decltype(expression) var,爲肯定類型,編譯器必須遍歷一個核對錶:
若是expression是一個沒有用括號括起來的標識符,則var的類型與該標識符的類型相同,包括const等限定符。
若是expression是一個函數調用,則var的類型與函數的返回類型相同(並不會實際調用函數)。
若是expression是一個左值,則var爲指向類型的引用,最顯而易見的狀況是expression是用括號括起來的標識符(括號不會改變表達式的值和左值性)。
若是前面的條件都不知足,則var類型和expression類型相同。