文章目錄
0. 版權聲明
- C++ 系列讀書筆記來源於 Bjarne Stroustrup 所著《C++程序設計原理與實踐(基礎篇)》;1
- 該系列筆記不以盈利爲目的,僅用於記錄學習過程中的知識要點和心得體會;
- 如有侵權,請與本人聯繫([email protected]),經覈實後即刻刪除;
- 轉載請註明出處;
1.elements
1.1 concept
- header file (頭文件):聲明的集合;
- 在使用 header file 的源文件和給出 header file 定義的源文件中都包含頭文件;
編譯器可捕獲聲明與定義不一致的錯誤;
- 在使用 header file 的源文件和給出 header file 定義的源文件中都包含頭文件;
- preprocessing (預處理):
#include
的處理邏輯在編譯器其它操作之前; - 同一變量名,可聲明多次,但只能定義一次;
- 條件表達式:
(a>=b)?a:b
(推薦的語法);
1.2 scope(作用域)
- 避免使用全局變量和
extern
;- 程序設計者難以判斷哪段程序讀寫全局變量;
- 在不同編譯單元中,全局變量的初始化順序不確定;
- explanation:實際程序中有大量變量名,局部變量易於管理;
- 作用域較大的變量,應使用富有描述性的名字;
- 局部函數(嵌套函數):在 CPP 中支持嵌套調用,不支持嵌套定義;
for (int i=0;i<s.size();++i)
i
的作用域僅限於該語句;
1.3 計算順序
1.3.1 表達式計算
- 賦值運算符
=
在算數表達式中並沒有特殊地位,因此不能保證=
左側的子表達式先於右側的子表達式計算;
v[i] = ++i; // logic exception;
v[++i] = i; // logic exception;
- 以上兩行代碼均無法確定計算順序;
1.4 namespace
- 全限定名:命名空間的名字(或類名)與成員名的組合;(e.g.
TextLib::Text
) - using 聲明:
using std::string
; - using 指令:
using namespace std
; - 避免對
std
等命名空間之外的名字使用 using 指令; - 儘量使用全限定名或 using 聲明;
- 避免將 using 指令置於 header file 文件之中,否則用戶有可能引起名字衝突;
2. 變量聲明與定義
2.1 初始化
double d = 7;
vector<int>vi(10);
vector<int>vi2{1,2,3,4};
const int x{9};
- 使用
=
初始化; - 使用
()
初始化; - 使用
{}
初始化;(被推薦的初始化方法) - 常量必須初始化;
2.2 默認初始化
- string、vector 等對象存在默認構造函數,可不進行初始化;
- string 默認值爲空串
""
; - vector 默認值爲空(不包含任何元素);
- string 默認值爲空串
- 全局變量默認初始化爲 0;
- 局部變量、類成員需要自行初始化;
3. 函數調用與返回
3.1 concept
int my_find(vector<string>vs, string s, int hint);
int my_find(vector<string>, string, int)
- 爲參數命名;
- 不爲參數命名;
- 在函數聲明和定義中,可以爲參數命名,也可以不命名;
- 確保選擇語句的每條路徑均有
return
或error
; - void 函數中無返回值合法,等價於
return;
; - 由於歷史原因,main 函數若無返回值,等價於
return 0
; - 值傳遞:函數中的參數爲函數中的局部變量;
- 活動記錄棧(也稱調用棧)、函數活動記錄;
- 調用函數時,活動記錄棧寫下函數活動記錄;
- 函數返回時,消除函數活動記錄;
- 先進先出;
3.2 引用傳遞
3.2.1 傳常量引用
void print(const vector<double>& v)
{
// ...
}
print(vd);
const
用於避免函數修改參數;
3.2.2 傳引用
&
引用的用途之一:作爲簡寫形式;
vector<vector<double>>v;
double& var = v[f(x)][g(y)];
- 二維 vector 元素的表示形式較爲複雜,可使用引用定義別名,以便讀寫;
3.2.3 傳常量引用、傳引用的區別
void g(int a, int& r, const int& cr)
{
// ...
}
g(1,2,3); // false;
g(1,y,3); // true;
- 錯誤:引用參數需要指向變量;
- 正確:常量引用可以指向字面常量;
- 常量引用不需要左值(lvalue);
- 在
g(1,y,3);
語句中,編譯器爲cr
分配一個整型變量,令cr
指向它;- temporary object:由編譯器生成的該變量;
- 選用傳遞方式的原則:
- 值傳遞:適用於對象較小;
- 常量引用傳遞:適用於無需修改的大對象;
- 返回值:使用函數返回值;
- 傳引用:迫不得已時使用;
n. reference
Bjarne S. C++程序設計原理與實踐(基礎篇)[M]. 任明明,王剛,李忠偉, 譯. 北京: 機械工業出版社, 2017. ↩︎