c++에서 레퍼런스는 일종의 변수에 대한 별칭이다.
레퍼런스 변수는 반드시 생성과 동시에 초기화해야 한다.
int x= 3;
int& ref=x;
ref는 x에 대한 또다른 이름이다.
ref를 사용하는 것은 x를 사용하는 것과 같다.
ref에 어떤 값을 대입하면 x값도 바뀐다.
ref=10;
정수 리터럴처럼 이름없는 값에 대해서는 레퍼런스 생성 불가이다.
단, const값에 대해서는 레퍼런스값 생성 가능
int& noname = 5; //(1) 에러 발생
const int& noname2 = 5 //(2) 정상 작동
(1)의 경우, 상수가 non-const 레퍼런스이기 때문이다. 이것은 5라는 상수를 수정하겠다는 의미
(2)의 경우, const 레퍼런스로 선언했기 때문에 값을 변경하지 않아 문제 없다
레퍼런스는 처음 초기화할 때 지정한 변수만 가르킨다. 레퍼런스는 한번 생성된 후, 가리키는 대상을 변경할 수 없다.
레퍼런스를 선언할 때 어떤 변수를 대입하면 레퍼런스는 그 변수를 가르킨다. 하지만 이미 선언된 레퍼런스에 다른 변수를 대입하면 레퍼런스가 가리키는 대상이 바뀌는 것이 아니라 레퍼런스가 원래 가리키던 변수의 값이 새로 대입한 변수의 값으로 바뀌게 되는 것이다.
int x=3, int y=4;
int& ref = x;
ref=y;
여기에서 ref가 y를 가르키는 것이 아니라 x의 값을 4로 변경하는 것.
여기에서 y의 주소값을 대입하면 대상을 바꿀 수 있을까? 싶지만 애초에... 막아두었다.
ref=&y //error
이유는 y의 주소는 포인터지만 ref는 포인터에 대한 레퍼런스가 아닌 int에 대한 레퍼런스이기 때문이다.
그렇다면, 레퍼런스에 레퍼런스를 대입하는 방식은 어떨까?
int x=3, z=5;
int& xref=x;
int& zref = z;
zref=xref;
마지막줄에서 zref가 가리키는 대상이 바뀌지 않고 z값이 3으로 변경된다.
xref가 가리키는 x값이 3이기 때문이다.
레퍼런스를 생성과 동시에 초기화하고 나면 레퍼런스가 가리키는 변수를 변경할 수 없고, 그 변수의 값만 바꿀 수 있다 !!
레퍼런스는 모든 타입에 대해 만들 수 있다.
int* intP;
int*& ptrRef = intP;
ptrRef = new int;
*ptrRef = 5;
ptrRef는 intP에 대한 레퍼런스이고, intP는 int에 대한 포인터이다.
ptrRef를 수정하면 intP가 수정됨