참조 변수 선언
포인터를 선언할때 *를 붙여 선언하듯이 &연산자를 붙여서 변수를 선언하면 참조 변수가 선언된다. 참조 변수는 일반 변수의 메모리를 공유하는 것처럼 동작한다. 주소를 의미하는 &연산자와는 다름에 주의
int value = 5;
int &ref = value;
cout << ref << endl;
ref = 10;
cout << ref << endl; // value 변수를 처리하는 것과 동일한 동작으로 수행됨

참조 변수의 주소
그렇다면 참조 변수의 주소는 어떨까? 참조 변수의 주소를 출력하여 직접 확인해보자. 결과적으로 원본 변수의 주소와 그것으로 초기화한 참조 변수의 주소는 동일하다.
int value = 5;
int &ref = value;
cout << &value << endl;
cout << &ref << endl;

참조 변수 사용시 제약사항
- 참조 변수는 반드시 선언과 동시에 초기화가 되어야한다. (const로 선언시에는 가능)
- r value로 초기화할 수 없다. (리터럴로 초기화 불가능)
- const 변수의 참조를 초기화하기 위해서는 참조도 const로 선언해야 한다.
참조변수의 재할당
변수를 재할당 하는것과 같이 참조도 변수 이름과 대입 연산자를 사용해서 재할당이 가능하다. 재할당시에 &연산자로 같이 붙일 필요는 없다.
int value1 = 5;
int value2 = 10;
int &ref1 = value1;
cout << ref1 << endl;
ref1 = value2;
cout << ref1 << endl;

참조를 함수 인자로 전달
참조를 함수의 인자로 전달하기 위해서는 매개변수 이름에 &를 붙여서 함수를 선언하면 된다. 참조로 전달한 변수는 call by reference이기 때문에 지역변수와는 달리 함수에서 적용한 변경사항이 원본 변수에 적용된다.
void doSomething(int &n)
{
n = 10;
}
int value1 = 5;
cout << value1 << endl;
doSomething(value1);
cout << value1 << endl;

배열의 레퍼런스를 함수 인자로 전달하고 싶을때도 &연산자를 사용하여 함수를 선언하면 된다. 유의할 점은 &연산자를 괄호 안에 넣어야 된다는 점이다.
void doSomething(int (&n)[5])
{
n[0] = 123;
}
int main()
{
const int length = 5;
int arr[length] = { 1, 2, 3, 4, 5 };
doSomething(arr);
cout << *arr << endl;
return 0;
}
구조체 접근에서의 참조 활용
구조체 멤버의 depth가 깊어지면 매번 접근하기 위해 . 연산자를 반복해서 붙여야 하기 때문에 코드가 어지러워질 수 있다. 참조를 사용하면 구조체 멤버 접근을 간소화할 수 있다.
struct Something
{
int v1;
float f2;
};
struct Other
{
Something st;
};
int main()
{
Other ot;
ot.st.v1 = 1;
int &v1 = ot.st.v1;
v1 = 2; // 참조를 통해 구조체 멤버에 간단하게 접근 가능
return 0;
}
const 참조 변수
제약사항에 참조 변수는 리터럴을 대입할 수 없다고 적어놨지만 const로 선언할 경우 리터럴 대입이 가능해진다.
const int &ref_x = 3 + 4;
cout << ref_x << endl;
cout << &ref_x << endl;

참조 변수를 const로 설정할 때의 장점은 함수 인자로 const 참조 변수를 전달 시 리터럴을 함수 인자로 넘겨 줄 수 있다는 점이다.
void doSomething(const int &x)
{
cout << x << endl;
}
int main()
{
int a = 1;
int &a_ref = a;
// 세 가지 경우 모두 사용 가능
doSomething(a);
doSomething(123);
doSomething(a_ref);
return 0;
}'C++ 학습' 카테고리의 다른 글
| [C++] void pointer (0) | 2023.11.23 |
|---|---|
| [C++] for each (0) | 2023.11.23 |
| [C++] 메모리 동적 할당 (0) | 2023.11.21 |
| [C++] 포인터 연산 (0) | 2023.11.21 |
| [C++] 포인터 (0) | 2023.11.21 |