1、case 标号必須是整形常量表達式。
對于switch結構,隻能在它的最後一個case标号或default标号後面定義變量;制定這個規則主要是為了避免代碼跳過變量的定義和初始化的情況。可以為某個特殊的case定義變量通過塊語句。
2、異常類型[2]
标準庫異常類定義在四個頭檔案中:
1)exception 頭檔案定義了最常見的異常類,它的類名是 exception。這個類隻通知異常的産生,但不會提供更多的資訊。
2)stdexcept 頭檔案定義了幾種常見的異常類,這些類型在表1中列出。
3)new 頭檔案定義了 bad_alloc 異常類型,提供因無法配置設定記憶體而由 new抛出的異常。
4)type_info 頭檔案定義了 bad_cast 異常類型。
表1
exception
最常見的問題。
runtime_error
運作時錯誤:僅在運作時才能檢測到問題
range_error
運作時錯誤:生成的結果超出了有意義的值域範圍
overflow_error
運作時錯誤:計算上溢
underflow_error
運作時錯誤:計算下溢
logic_error
邏輯錯誤:可在運作前檢測到問題
domain_error
邏輯錯誤:參數的結果值不存在
invalid_argument
邏輯錯誤:不合适的參數
length_error
邏輯錯誤:試圖生成一個超出該類型最大長度的對象
out_of_range
邏輯錯誤:使用一個超出有效範圍的值
3、使用預處理器進行調試
1)預設,NDEGUG未定義。
#ifndef NDEBUG
cerr << "starting main" << endl;
#endif
預處理器還定義了其餘四種在調試時非常有用的常量:
__FILE__ 檔案名
__LINE__ 目前行号
__TIME__ 檔案被編譯的時間
__DATE__ 檔案被編譯的日期
__FUNCTION__ 函數名
2)assert(expr) //cassert
隻要NDEGUG未定義,assert就求解。
4、文法上塊就是單語句。
5、函數不能傳回另外一個函數或者内置數組類型,但可以傳回指向函數的指針,或指向數組元素的指針的指針
6、可以将指向const對象的指針初始化為指向非const對象,反之不成立。
應該将不需要修改的引用形參定義為const引用。普通的非const引用形參在使用時不太靈活;這樣的形參既不能用const對象初始化,也不能用字面值或産生右值的表達式實參初始化。
如下示例
應當把string &s寫成const string &s。
7、指向指針的引用
void ptrswap(int *&v1){}
8、C++程式員傾向于通過傳遞指向容器中需要處理的元素的疊代器來傳遞容器。
示例
9、數組的兩個特殊性質:
一是不能複制數組;二是使用數組名字時,數組名會自動轉化為指向其第一個元素的指針。
當編譯器檢查數組形參關聯的實參時,它隻會檢查實參是不是指針、指針的類型和數組元素的類型時是否比對,而不會檢查數組的長度。
一般來說,非引用類型的形參會初始化為其相應實參的副本。
10、多元數組就是數組的數組。
11、傳遞給函數的數組的處理
1)在數組本身放置一個标記來檢測數組的結束。C 風格字元串就是采用這種方法
的一個例子,它是一種字元數組,并且以空字元 null 作為結束的标記。處理 C
風格字元串的程式就是使用這個标記停止數組元素的處理。
2)第二種方法是傳遞指向數組第一個和最後一個元素的下一個位置的指針。如同前面的例子所示。
3)第三種方法是将第二個形參定義為表示數組的大小。
12、函數的傳回值用于初始化在調用函數處建立的臨時對象。在求解表達式時,
如果需要一個地方儲存其運算結果,編譯器會建立一個沒有命名的對象,這就是
臨時對象。
千萬不要傳回局部對象的引用或指針。
13、預設實參
如果有一個形參具有預設實參,則它後面所有的形參都必須有預設實參。預設實參隻能用來替換函數調用缺少的尾部實參。在一個檔案中,隻能為一個形參指定預設實參一次。通常在函數聲明中指定,并把該聲明放在合适的頭檔案中。
如果在函數定義的形參表中提供預設實參,那麼隻有在包含該函數定義的源檔案中調用該函數時,預設實參才是有效的。
14、作用域和生存期
名字的作用域指知道該名字的程式文本區。對象的生存期是在程式執行過程中對象生存的時間。
示例代碼
輸出1,2,3...
15、重載
函數不能僅僅基于不同的傳回類型而實作重載。
值得注意的是,形參與 const 形參的等價性僅适用于非引用形參。有 const 引用形參的函數與有非 const 引用形參的函數是不同的。類似地,如果函數帶有
指向 const 類型的指針形參,則與帶有指向相同類型的非 const 對象的指針形參的函數不相同。
在函數中局部聲明的名字将屏蔽在全局作用域内聲明的同名名字。這個關于變量名字的性質對于函數名同樣成立。同樣,作用域規則也适用于重載函數名。如果局部地聲明一個函數,則該函數将屏蔽而不是重載在外層作用域中聲明的同名函數。
同名查找發生在類型檢查之前。
可基于函數的引用形參是指向 const 對象還是指向非 const 對象,實作函數重載。不能基于指針本身是否為const 來實作函數的重載。
16、常量成員函數不能修改所操作的對象的資料成員。
17、函數指針
1)在引用函數名但又沒有調用該函數時,函數名将被自動解釋為指向函數的指
針。假設有函數:
// compares lengths of two strings
bool lengthCompare(const string &, const string &);
除了用作函數調用的左操作數以外,對 lengthCompare 的任何使用都被解
釋為如下類型的指針:
bool (*)(const string &, const string &);
2)可使用函數名對函數指針做初始化或指派。函數指針隻能通過同類型的函數或函數指針或 0 值常量表達式進行初始化或指派。将函數指針初始化為 0,表示該指針不指向任何函數。指向不同函數類型的指針之間不存在轉換。
3)如下一下定義:
int (*ff(int))(int*, int);//将ff聲明為一個函數,它帶有一個int型的形參。該函數傳回int (*)(int*, int);
允許将形參定義為函數類型,但函數的傳回類型則必須是指向函數的指針,不能是函數。
4)函數指針形參
按兩種形式編寫:
5)指向重載函數的指針
指針的類型必須與重載函數的一個版本精确比對。
18、靜态局部對象和全局變量在程式開始執行時建立,main結束時撤消。預設初始化值為0,而其它局部變量則預設初始化未定義。
19、this指針
成員函數的隐式形參。this指針指向調用該函數的對象,是指向類類型的指針。在 const 成員函數中,該指針也指向 const 對象。
參考: