跳至主要内容

CH5 Functions

備註

本文為 2021-Fall 學期旁聽台大資管系孔令傑教授開授的 Programming Design 所記錄的課程筆記。課程內容程式碼可以參閱我的 Github repo: C++ Programming-Design-2021-Fall

Function

C++中function是由header與body組成,分別有system-defined functions, user-defined functions宣告的prototype:

return_type function_name(parameter_type parameter_name);

另外C++ funtion一次只能回傳一個變數,若要回傳多個值,要用class與object。 參考5_1.cpp


Function prototype

在C++中funtion 須在main()前先declare,並在main()後define內容。同樣也可以在main()前直接defination取代declaration,就不用另外做declaration。但需要小心若多個function間有互相呼叫關係,那要確保呼叫的function以經被define好了,若兩function間互相呼叫,就一定只能用function prototype。
參考5_2.cpp, 5_3.cpp


Function parameters v.s. arguments

parameters: 用來稱函數block內的變數。 (function內)
arguments: 用來稱傳入函數的原始變數。 (function外)
參考5_4.cpp


Function return value

若函數在if else控制流程中沒有return指定數值,函數仍然會回傳一任意數字,這就像是宣告變數但未指定初始值的狀況一樣。
參考5_5.cpp


Operator also return value

cin >>, cout << 本身會回傳istream& object作為回傳值,當將cin >> 寫在while中時,若是以鍵盤輸入就會永遠跳不出while迴圈,但若是以指令直接讀取文檔時,當cin>>讀不到檔案內的資料就會回傳一個false value。
參考5_6.cpp


變數生命週期

1. local variable: 出了block就消失。
參考5_7.cpp
2. global variable: 不定義在任何block裡面,因此任何block都可以使用它。(不建議使用) 呼叫時可以使用operator::來指定使用global variable。
參考5_8.cpp
3. external variable: keyword: external,當大型系統中多個程式同時存取同個變數extermal int a,在其中一個程式改動這個a,其他城市中的a也會一起變動。(不建議使用)
4. static variable: 雖然是在block裡面被宣告,但其特性像global variable一樣在程式結束前都不會被清除。
參考5_9.cpp, 5_10.cpp, 5_11.cpp


Call by value

當使用call by value mechanism時,會在funtion block內建立記憶體空間宣告local variable作為parameter,再將argument的值複製給parameter,等block執行結束後便會清除local variable,釋放記憶體空間。
其特點是function可被寫為independent entities,寫function時不需要管外部的任何變數,不會影響或被影響。
參考5_12.cpp

但有些情境我們會需要function去改變傳入的arguments本身的值,我們可以:

  • call by reference
  • 傳入array(傳址)

Passing an 1d array as an argument

範例:

void printArray(int arr[]);

Array 變數事實上存的是第一個變數的address。
參考5_13.cpp, 5_14.cpp


Passing an 1d array as an argument

範例:

int num[5][2];
void printArray(int arr[][2]);

C++在處理2維陣列會理解為1排1維陣列,因此必須告訴compiler傳入的一排東西是長度為2的1維陣列。


Reference