蔡銘軒 @ Sprout 2021 C/C++語法班
int a = 3, b = 5; std::swap(a, b); std::cout << a << ' ' << b << "\n";
char s1[10] = "hello"; char s2[10] = "World"; int len1 = strlen(s1); int len2 = strlen(s2);
Function 的用途/好處
type function_name(parameters) { /* do something */ return variable; }
int plus_one(int number) { return number + 1; }
範例
Function 可以回傳數值/變數
需要定義 Function 的回傳型別
bool is_positive(int number) { return number > 0; }
double get_circle_area(int radius) { const double PI = 3.14; return radius * radius * PI; }
可以作為變數型別的,也都可以作為 Return Type
但...如果沒有要回傳任何東西呢?
int a = 3, b = 5; std::swap(a, b); std::cout << a << ' ' << b << "\n";
void
只能作為 Return Type,不能作為變數的型別
void print_hello() { std::cout << "hello\n"; }
void 即沒有回傳變數,連 return 都可以省略
傳入一維陣列
int sum_array(int arr[], int n) { int sum = 0; for (int i = 0; i < n; i++) sum += arr[i]; return sum; }
int arr[100] = {1, 2, 3}; int sum = sum_array(arr, 100);
傳入二維陣列
int sum_2d_array(int arr[][100], int n, int m) { int sum = 0; for (int i = 0; i < n; i++) for (int j = 0; j < m; j++) sum += arr[i][j]; return sum; }
int arr[100][100]; int sum = sum_2d_array(arr, 100, 100);
Pass by value
void swap(int a, int b) { int c = a; a = b; b = c; }
int a = 3, b = 5; swap(a, b); std::cout << a << ' ' << b << "\n";
試試看,結果是什麼?
Pass by value
一般傳參數的時候,數值是被複製進去的
void swap(int a, int b) { ... } int c = 3, d = 5; swap(c, d);
c的值被複製給a
d的值被複製給b
但c跟a(d跟b)是不同變數
Pass by reference
void swap(int& a, int& b) { int c = a; a = b; b = c; }
int a = 3, b = 5; swap(a, b); std::cout << a << ' ' << b << "\n";
試試看,結果是什麼?
Pass by reference
加上 '&' 讓參數不再是複製品
void swap(int& a, int& b) { ... } int c = 3, d = 5; swap(c, d);
a被視為跟c是同一個變數
操作a時會影響到c
b跟d亦同
題外話
void plus_one(int arr[]) { arr[0]++; } int arr[10] = {0}; plus_one(arr); std::cout << arr[0] << "\n";
試試看,結果是什麼?
題外話
傳遞陣列時,其實也是Pass by value
但並不是複製一個新的陣列
之後課程教到 指標 時就會明白
先把陣列當成例外:
傳遞陣列時,更改陣列內容會影響到外面
Default parameters
可傳可不傳的參數
int increment(int num, int delta=1) { return num + delta; } int n = 3; int inc1 = increment(n); int inc2 = increment(n, 2);
Default parameters
非 default 的參數,一定要傳入數值
default 的參數一定要放在最後面
int increment(int num, int delta=1);
int increment(int delta=1, int num);
Function 結束(並回傳)
當 Function Type 不是 void 時,就要搭配return
return的功能:
結束 Function 的執行
int divide(int a, int b) { if (b == 0) return -1; return a / b; }
void 也可以 return
void print() { return; std::cout << "will not print\n"; }
回傳數值給呼叫者
int get_one() { return 1; }
int one = get_one(); std::cout << one << "\n";
回傳數值給呼叫者
一個 Function 可以回傳兩個以上數值嗎
int quadratic(int a, int b, int c) { // solve... return x1, x2; }
例:解一元二次方程式
回傳數值給呼叫者
如果需要回傳多個數值怎麼辦?
之後的課程(可能)會教到
Function 必須在使用前宣告
int main() { int a = 3, b = 5; swap(a, b); } void swap(int a, int b) { ... }
void swap(int a, int b) { ... } int main() { int a = 3, b = 5; swap(a, b); }
Or... Forward Declaration
void swap(int a, int b); int main() { int a = 3, b = 5; swap(a, b); } void swap(int a, int b) { ... }
一個 Function 只做一件事
int find_max_and_min_and_median(int arr[]);
int find_max(int arr[]); int find_min(int arr[]); int find_median(int arr[]);