C primer 讀書筆記(9)

2021-06-22 03:23:11 字數 1515 閱讀 1045

在函式宣告裡值得注意的一點是預設形參(default parameter)的宣告。預設形參即在呼叫函式時可以省略實參的形參,所以我覺得也可以翻譯成預設形參。在宣告函式時就顯式地給這些引數賦值了,如果沒有傳入實參,則直接使用預設值,如果傳入實參,就會覆蓋原來的預設值。有人可能會擔心,既然可以省略實參,那麼在呼叫函式時怎麼知道到底省略了哪些引數呢?為了消除歧義,首先,在宣告函式時,其引數列表中一旦出現了預設引數,其後的引數必須都是預設引數;第二,在呼叫函式時,只能按順序為預設引數傳入實參,不能跳躍,見下例:

void fun(int height=80, int width=40, char background='*')

fun(); //由於所有形參都是預設引數,可以無實參呼叫函式

fun(50); //只提供乙個實參一定是傳給第乙個預設形參的,即給height賦值50

fun('*'); //雖然形式上是正確的,但是實際上『*』傳給了height,因為不可能跳過height和width直接給background賦值

由以上兩條,我們可以得到實踐上的第三點:在提供函式列表時,把最有可能使用預設值的引數放在最後面,把最不可能使用預設值的引數放在最前面,這樣才能有效減少預設引數的輸入,設想如果反過來,就算我們要使用預設值,由於要對後面的引數賦值,必須對前面的預設引數再輸入一遍預設值。

我們知道變數的使用範圍這個概念,物件的存在時間也同樣是有限制的。我們把在函式內定義的一般物件稱為自動物件(automatic objects),它們會隨著函式的執行結束而被清除,此後無法再使用這個物件(在語句塊內定義的物件會在語句塊結束後被清除)。當然,如果我們想讓物件在函式結束後依然存在,可以定義靜態區域性物件(static local objects)。舉個例子如下:

size_t count_calls()

int main()

{ for (size_t i=0;i<10;++i)

cout<

簡單的講,inline函式就是直接將函式內容替換掉函式呼叫的位置然後直接執行的函式。因為對於一般的函式,我們使用時是要通過呼叫的,函式呼叫有一定的時間代價,比如中斷處理和返回,儲存暫存器的內容,將實參賦值給形參,程式控制分支跳轉等等。有什麼辦法可以避免這些耗時呢,簡單的做法就是在編譯的時候就將函式的所有操作插入到所有呼叫該函式的位置,執行的時候就可以順流直下,不需要中斷,這就是inline函式,我們在宣告函式時在其返回型別前面加上inline關鍵字就可以了。例如:

inline const string &shorterstring(string &s1, string &s2)

{ return s1

原因有四:

1. 如果有很多地方需要這個計算,每個地方都要寫一遍這些語句,如果需要修改,則要乙個乙個的改,但如果定義了函式,就只用改一次;

2. 從函式名可以判斷所執行操作的目的,比直接寫語句具有更高的可讀性;

3. 寫成函式有利於復用,在其他程式裡也可以直接拿來用;

4. 可以保證每次呼叫函式執行的是一致的操作,如果乙個乙個寫語句,可能會出現錯誤導致不同地方執行的操作不同

《C Primer》讀書筆記(9)

1.運算子過載,當有的時候物件運算與正常運算子的操作意義相同時,為了 的簡潔,我們就可以使用運算子過載。比如乙個簡單的加法操作,沒有必要再寫乙個add方法,還是乙個 看著比較順眼。include stdafx.h include include using namespace std class a...

《c primer》讀書筆記9

筆記範圍 2.6節 每個程式設計師都知道,在程式執行過程中,一些情況是不可預料的,無論程式的設計看起來是多麼完善,在某個特定的環境裡同樣會出錯,但是這樣的錯誤往往會有些共同之處,比如 new的時候也許會空間不足。顯然這樣的錯誤。不能完全說是程式設計的問題,但是如果你的程式能對這些情況做出反應,那麼這...

C primer 讀書筆記

第2 章 變數和基本型別 1 變數直接初始化和變數 複製初始化 int ival 1024 direct initialization int ival 1024 copy initialization 初始化不是賦值 2 內建型別復 制初始化和直接初始化幾乎沒有區別 但 對類型別物件來 說,有些初...