chapter 8 function (reading notes)

0. 版權聲明

  • C++ 系列讀書筆記來源於 Bjarne Stroustrup 所著《C++程序設計原理與實踐(基礎篇)》;1
  • 該系列筆記不以盈利爲目的,僅用於記錄學習過程中的知識要點和心得體會;
  • 如有侵權,請與本人聯繫([email protected]),經覈實後即刻刪除;
  • 轉載請註明出處;

1.elements

1.1 concept

  • 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 默認值爲空(不包含任何元素);
  • 全局變量默認初始化爲 0;
  • 局部變量、類成員需要自行初始化;

3. 函數調用與返回

3.1 concept

int my_find(vector<string>vs, string s, int hint);
int my_find(vector<string>, string, int)
  • 爲參數命名;
  • 不爲參數命名;
  • 在函數聲明和定義中,可以爲參數命名,也可以不命名;

  • 確保選擇語句的每條路徑均有 returnerror
  • 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


  1. Bjarne S. C++程序設計原理與實踐(基礎篇)[M]. 任明明,王剛,李忠偉, 譯. 北京: 機械工業出版社, 2017. ↩︎

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章