在函數(shù)的很多次調(diào)用中它們都被賦予一個相同的值善榛,此時我們把這個反復(fù)出現(xiàn)的值稱為函數(shù)的默認(rèn)實參咕别。
調(diào)用含有默認(rèn)實參的函數(shù)時收叶,可以包含該實參掀潮,也可以省略該實參菇夸。
我們可以為一個或多個形參定義默認(rèn)值,不過需要注意的時仪吧,一旦某個形參被賦予了默認(rèn)值庄新,它后面的所有形參都必須有默認(rèn)值。
如果想使用默認(rèn)實參,只要在調(diào)用函數(shù)的時候省略該實參就可以出皇。
函數(shù)調(diào)用時羞芍,實參按其位置解析,默認(rèn)實參負責(zé)填補函數(shù)調(diào)用缺少的尾部實參(靠右側(cè))
當(dāng)設(shè)計含有默認(rèn)實參的函數(shù)時郊艘,其中一項任務(wù)是合理設(shè)置形參的順序荷科,讓不怎么使用默認(rèn)值的形參出現(xiàn)在前面。
對于函數(shù)的聲明纱注,通常習(xí)慣將其放在頭文件中畏浆,并且一個函數(shù)只聲明一次。但多次聲明同一個函數(shù)也是合法的狞贱。
在給定的作用域中一個形參只能被賦予一次默認(rèn)實參刻获。
函數(shù)的后續(xù)聲明只能為之前那些沒有默認(rèn)值的形參添加默認(rèn)實參,而且該形參右側(cè)的所有形參必須都有默認(rèn)值瞎嬉。
通常應(yīng)該在函數(shù)聲明中指定默認(rèn)實參蝎毡,并將該聲明放在合適的頭文件中。
局部變量不能作為默認(rèn)實參佑颇。此外只要表達式的類型能轉(zhuǎn)換成形參所需的類型顶掉,該表達式就能作為默認(rèn)實參。
用作默認(rèn)實參的名字在函數(shù)聲明所在的作用域內(nèi)解析挑胸,而這些名字的求值過程發(fā)生在函數(shù)調(diào)用時:
但調(diào)用函數(shù)一般比求等價表達式的值要慢一些痒筒。
將函數(shù)指定為內(nèi)聯(lián)函數(shù),通常就是將它在每個調(diào)用點上“內(nèi)聯(lián)地”展開茬贵。假設(shè)我們把 shorterString 函數(shù)定義成內(nèi)聯(lián)函數(shù):
cout << shorterString(s1,s2) << endl;
// 將在編譯過程中展開成類似于下面的形式?
cout << (s1.size() < s2.size() ? s1: s2 ) << endl;
從而消除了?shorterString 函數(shù)的運行時開鎖
在?shorterString 函數(shù)的返回類型前面加上關(guān)鍵字 inline 簿透,就可以將它聲明成內(nèi)聯(lián)函數(shù)。
constexpr 函數(shù)是指能用于常量表達式的函數(shù)解藻。
定義?constexpr 函數(shù)的方法與其它函數(shù)類似老充,不過要遵循幾條約定:函數(shù)的返回類型及所有形參的類型都得是字面值類型,而且函數(shù)體中必須有且只有一條 return 語句螟左。
constexpr 函數(shù)中可以有空語句啡浊、類型別名觅够、using聲明等。
內(nèi)聯(lián)函數(shù)和 constexpr函數(shù)通常定義在頭文件中巷嚣。
C++中有時會用到一種類似頭文件保護的技術(shù)喘先,以便有選擇地執(zhí)行調(diào)試代碼。
程序可以包含一些用于調(diào)試的代碼廷粒,但這些代碼只在開發(fā)程序時使用窘拯。當(dāng)應(yīng)用程序編寫完成準(zhǔn)備發(fā)布時會屏蔽掉調(diào)試代碼。
用到的兩項處理功能 assert 坝茎、NDEBUG?
assert 是一種預(yù)處理宏涤姊,也就是一個預(yù)處理變量,它的行為有點類似于內(nèi)聯(lián)函數(shù)嗤放。assert宏 使用一個表達式作為它的條件思喊。
首先對 expr 求值,如果表達式為假斤吐,assert 輸出信息并終止程序的執(zhí)行搔涝。如果表達式為真厨喂,assert 什么也不做和措。
assert宏定在 cassert 頭文件中。其常用于檢查“不能發(fā)生”的條件蜕煌。
assert 的行為依賴于一個名為 NDEBUG 的預(yù)處理變量的狀態(tài)派阱。如果定義了?NDEBUG 則 assert 什么也不做。默認(rèn)狀態(tài)下并沒有定義?NDEBUG 所以assert 將執(zhí)行運行時檢查斜纪。
可以使用一個 #define 語句定義?NDEBUG?贫母,從而關(guān)閉調(diào)試狀態(tài)。
除了用于 assert 外盒刚,也可以使用?NDEBUG 編寫自己的條件調(diào)試代碼腺劣。如果 NDEBUG 未定義,將執(zhí)行 #ifnder 和 #endif 之間的代碼因块,如果定義了?NDEBUG 這些代碼將被忽略橘原。
變量_ _func_ _用于輸出當(dāng)前調(diào)試的函數(shù)的名字,是一個 const char 的一個靜態(tài)數(shù)組涡上,用于存放函數(shù)的名字趾断。
可以使用這些常量在錯誤消息中提供更多信息。