call by reference
call by reference는 인자의 값이 아니라 참조를 전달하는 것이다. 함수 호출시 지역변수로 전달되는 값은 원본 데이터를 참조하는 참조다. call by reference를 하기 위해서는 함수 선언서 parameter를 참조 변수로 하면 된다.
void addOne(int &y)
{
cout << y << " " << &y << " (in function)" << endl;
y = y + 1;
}
int main()
{
int x = 5;
cout << x << " " << &x << endl;
addOne(x);
cout << x << " " << &x << endl;
return 0;
}

함수 출력으로써 call by reference
call by reference가 유용하게 쓰이는 한 경우는 함수의 출력으로써 인자를 전달할때다. 복수의 출력 값이 필요한 것과 같은 경우에 유용하게 사용 가능하다. 아래 코드에서 sin, cos 각각의 결과 값을 참조 변수에 대입하여 전달한다. 입력 인자는 변경이 불필요한 경우 const 키워드를 붙여 애초에 변경이 불가능하게끔 할 수도 있다. 어떤 인자가 입력이고 출력인지 혼동될 경우 const로 입력되는 인자는 최소한 입력 인자라는 것을 알 수 있게끔 하는 용도도 존재한다. 포인터보다는 사용법이 더 직관적이라고 개인적으로 생각된다.
특히나 입력 인자를 const 참조 변수로 전달하는 것은 c++ 프로그래밍을 할 때 굉장히 많이 쓰이는 방식이기 때문에 알아두는게 좋다.
void getSinCos(const double °rees, double &sin_out, double &cos_out)
{
const double pi = 3.141592;
double radians = degrees * pi / 180.0;
sin_out = std::sin(radians);
cos_out = std::cos(radians);
}
int main()
{
double sin(0.0);
double cos(0.0);
getSinCos(30.0, sin, cos);
cout << sin << endl;
cout << cos << endl;
return 0;
}

포인터의 참조 전달
포인터의 참조가 필요할 경우 int *&와 같은 형식으로 parameter를 선언하면 된다. 해석이 햇갈릴 수도 있는데 왼쪽부터 int 변수의 -> 포인터의 -> 참조 변수 와 같은 순서로 적용된다. 아니면 typedef를 사용하여 int *의 alias를 지정하면 보다 쉽게 사용할 수 있다.
void foo(int *&ptr)
{
cout << ptr << " " << &ptr << endl;
}
int main()
{
int x = 5;
int *ptr = &x;
foo(ptr);
return 0;
}
배열의 참조 전달
배열의 참조를 전달할 때 주의사항이 있는데 int &arr[5]와 같은 식으로 쓰면 안되는 것이다. 해당 표기는 참조변수의 배열이며 C++에서는 허용되지 않는다. int (&arr)[5] 와 같은 식으로 parameter를 설정해야 한다.
void changeElement(int (&arr)[5])
{
arr[0] = 123;
}
int main()
{
int arr[]{ 1, 2, 3, 4, 5 };
changeElement(arr);
cout << arr[0] << endl;
return 0;
}'C++ 학습' 카테고리의 다른 글
| [C++] call by value (0) | 2023.11.24 |
|---|---|
| [C++] std::vector (0) | 2023.11.24 |
| [C++] std::array (0) | 2023.11.24 |
| [C++] 다중 포인터 (0) | 2023.11.23 |
| [C++] void pointer (0) | 2023.11.23 |