《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:

  1. 這裡的示例代碼對原書進行了修改,說實話原書的示例我沒看懂,誰給解釋解釋?
  2. 沒能理解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

下面的兩句話很好的解釋了這個現象

  1. 用作實參的名字在函數聲明所在的作用域內解析
  2. 求值過程發生在函數調用時

也就是說

  1. screen只會找同一作用域內的變數作為實參,所以後來定義的局部變數wd根本是不可見的
  2. 默認實參只是代替了實參,但是初始化形參的時機沒有變,還是發生在函數調用時。因此改變全局變數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

本文僅發佈於:

微信公眾號:馬志峰的編程筆記

知乎專欄:zhuanlan.zhihu.com/mazh


推薦閱讀:

雨晴月照
八月書單回顧║我們讀書而後知道自己並不孤單
十月讀書筆記

TAG:C | 读书笔记 | 新手入门 |