《C++ Primer》讀書筆記-第六章 05 特殊用途語言特性
聲明:
- 文中內容收集整理自《C++ Primer 中文版 (第5版)》,版權歸原書所有。
- 原書有更加詳細、精彩的釋義,請大家購買正版書籍進行學習。
- 本文僅作學習交流使用,禁止任何形式的轉載
- 默認實參
- 內聯函數
- constexpr函數
- 調試幫助
默認實參作為形參的初始值出現在形參列表中
如果某個形參被賦予了默認值,它後面的所有形參都必須有默認值如果在調用時省略了實參,則使用默認實參初始化形參
默認實參聲明
允許多次聲明同一個函數,給不同的形參添加默認實參
在給定的作用域中,一個形參只能被賦予一次默認實參string screen( int width, int height, char title = ); nstring screen( int width, int height, char title = * ); nstring screen( int width = 24, int height = 80, char title );n
第二條聲明語句是錯誤的,一個形參只能被賦予一次默認實參
第三條聲明語句是正確的,可以看到它並沒有再次給title設置默認實參
MZF:
- 這裡的示例代碼對原書進行了修改,說實話原書的示例我沒看懂,誰給解釋解釋?
- 沒能理解c++支持這種語法有什麼用,一次把默認值都聲明好不就行了么
默認實參初始值
int wd = 80; nchar def = ; nint ht(); nstring screen( int width = ht(), int height = wd, char title = def ); nnvoid f2() n{ n def = *; n //def改變了默認實參的值 n int wd = 100; n //wd隱藏了外層定義的wd,但沒有改變默認值 n string window = screen(); n}n
下面的兩句話很好的解釋了這個現象
- 用作實參的名字在函數聲明所在的作用域內解析
- 求值過程發生在函數調用時
也就是說
- screen只會找同一作用域內的變數作為實參,所以後來定義的局部變數wd根本是不可見的
- 默認實參只是代替了實參,但是初始化形參的時機沒有變,還是發生在函數調用時。因此改變全局變數def的值後,默認實參也發生了改變
MZF: 代碼同樣有少的修改,原書聲明函數時不指明形參名,默認實參有什麼用?
內聯函數
一次函數調用實際包含著一系列工作:
- 調用前要先保存寄存器,並在返回時恢復
- 可能要拷貝實參
- 程序轉向一個新的位置繼續執行
把函數聲明為內聯函數可以避免這一系列的開銷
函數聲明前加上inline關鍵字就可以了
聲明為內聯函數後,在編譯時將函數在每個調用點上「內聯地」展開
因為要展開,所以內容長的函數不適合內聯
constexpr函數
函數的返回類型必須是字面值類型
所有形參的類型必須是字面值類型constexpr函數被隱式地指定為內聯函數
調試幫助
assert預處理宏
需要引入cassert頭文件
assert( expr );n
如果表達式的值為假(即0),assert輸出信息並終止程序的執行
NDEBUG預處理變數
當然,我們並不會希望程序發布的時候assert也發揮作用,時不時的終止程序的執行
如果定義了NDEBUG,則assert什麼也不做
我們也可以編寫自己的調試代碼
#ifndef NDEBUG n cout << "debug" << endl; n#endifn
預處理器還定義了4個對調試很有用的名字
__FILE__ n__LINE__ n__TIME__ n__DATE__n
本文僅發佈於:
微信公眾號:馬志峰的編程筆記
知乎專欄:https://zhuanlan.zhihu.com/mazhifeng推薦閱讀: