###### 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