728x90
참조자(레퍼런스)
C
는 포인터만 사용할 수 있었지만, C++
은 포인터뿐 아니라, 참조자(reference)
방식도 제공한다.
int a = 3;
int& a_ref = a; //a_ref변수는 변수a의 참조자다.
cout << a << endl; //3
cout << a_ref << endl; //3 동일하다.
a_ref = 5;
cout << a << endl; //5
cout << a_ref << endl; //동일하다.
포인터와 레퍼런스는 비슷해 보이지만, 몇가지 차이점이 있다.
1. 레퍼런스는 선언과 동시에 초기화 해야한다.
포인터는 선언만 먼저 해도됨
2. 한번 별명이 지정되면 별명을 바꿀 수 없다.
포인터는 가리키던 주소를 바꿀 수 있음
3. 메모리상에 존재하지 않을 수 있다.
포인터는 일종의 변수이기 때문에, 메모리상에 존재함
int a;
int& a_ref = a; //a_ref는 변수 a의 레퍼런스이다.
이 경우에는, 컴파일러가 a_ref가 쓰이는 메모리공간을 모두 a가 사용하는 메모리 공간으로 대체한다.
int x = 5;
int& y = x;
int& z = y; //x의 레퍼런스를 선언해라와 동치
//따라서 y와 z는 모두 x의 레퍼런스가 된다.
scanf
와 cin
C에서 사용하던 scanf
는 인자에 &(주소연산자)
를 붙여야하지만, cin
은 붙이지 않는다.
scanf("%d", &x); //주소 연산자를 붙힘
//하지만
cin >> x; //주소 연산자를 붙히지 않는다.
왜냐면, cin은 인자로 레퍼런스를 받기 때문이다.
레퍼런스의 배열, 배열의 레퍼런스
레퍼런스의 배열은 X
int& ref[3] = {a, b, c} //이건 안된다.
//레퍼런스는 메모리에 공간을 차지하지 않을 수 있기 때문에
배열의 레퍼런스는 가능
int arr[3] = {1, 2, 3};
int(& ref)[3] = arr;
1. 레퍼런스 리턴 함수
int& func() //참조자를 리턴한다.
{
int a = 2;
return a;
}
int main(void)
{
int b = func();
b = 3;
}
하지만, 컴파일 오류가 난다.
왜냐면, 변수 a
는 지역변수로써 함수가 끝나면 메모리상에서 사라지게 되기 때문이다.
2. 레퍼런트 리턴함수
int& func(int& a)
{
a = 5;
return a;
}
int main(void)
{
int b = 2;
int c = func(b);
}
func
함수는 인자로 레퍼런스를 받고, 레퍼런스가 가리키는 곳의 값을 5로 바꾼다.
func(b)
에서는 b를 인자로 전달한다. 즉, 인자로 레퍼런스로 받기 때문에, int& a = b;
와 같은 효과를 낸다.
변수 c는 func로 부터 레퍼런스a를 전달받지만, c의 자료형이 int이기 때문에, 레퍼런스a의 값인 5를 받는다.
ps)C/C++를 공부할 때,
공식문서를 찾아보는 습관을 길러야겠다.https://ko.cppreference.com/w/cpp
728x90
'C++ > 개인 공부' 카테고리의 다른 글
C++/ 생성자, 기본 생성자, 복사 생성자 (0) | 2025.02.04 |
---|---|
가상 함수와 오버라이딩 (0) | 2023.06.07 |