###### tags: `C/C++` # 比較Call by value, Call by address and Call by reference ## Call by value * 只是把value複製給對方 ``` void swap(int a, int b) { int temp = a; a = b; b = temp; } int main() { int a=3, b=5; swap(a, b); printf("a=%d b=%d", a, b); } ``` 結果什麼都不會變。 ## Call by address * 正確來說,還是call by value,只是傳的值剛好是address * C語言只有call by value ``` void swap(int *a, int *b) { int temp = *a; *a = *b; // 透過pointer賦值 *b = temp; } int main() { int a=3, b=5; swap(&a, &b); printf("a=%d b=%d", a, b); } ``` ## Call by reference * 只有C++支援 ``` void swap(int &a, int &b) { int temp = a; a = b; b = temp; } int main() { int a=3, b=5; swap(a, b); printf("a=%d b=%d", a, b); } ``` ## C++: Reference (參照,引用) * 只有C++支援 * 當作別名(alias)使用 ``` int ival = 1024; int &refVal = ival; // 合法 int &refVal2; // 不合法,reference必須被初始化 int &refVal3 = 10; // 不合法,初值必須是object ``` 一旦reference被初始化,只要它扔然存在,就會持續綁定原先的物件。沒有辦法重新綁定至另一物件。 ### const reference ``` const int ival = 1024; const int &refVal = ival; // 合法 int &ref2 = ival; // 不合法,ref2是nonconst ``` 但是以下是在cont reference合法的 ``` int i =42; const int &r = 42; const int &r2 = r + 1; ``` 一個nonconst reference只能綁定在與reference本身同型別的物件上。但是一個nonconst reference可以綁定在不同(但相關)型別的物件或某個右值上。 ## 效能比較 Reference = Address > Value ### References: [1] http://wp.mlab.tw/?p=176 [2] https://eeepage.info/call-by/ [3] C++ Primer 4/e p.58