반응형
레퍼런스 : 변수의 별명. 포인터와 비슷하게 보인다.
형식
자료타입& 변수이름 = 대상변수;
short s = 5;
// 레퍼런스
short& rs = s;
//포인터
short* ps = &s;
cout << s << endl;
cout << rs << endl;
cout << *ps << endl;
--------------------
OUTPUT
5
5
5
포인터와 레퍼런스는 내부적으로 비슷하게 동작하는데, 굳이 왜 포인터를 쓰냐? -> 차이점이 있다.
- 레퍼런스변수는 별도의 공간이 없다. 같은 메모리번지수를 사용한다. 별명일뿐
- 포인터는 별도의 공간을 할당을 받아서 가리키게 되는 것.
각 변수의 메모리 주소를 찍어보자.
cout << &s << endl;
cout << &rs << endl;
cout << &ps << endl;
--------------------
output
0x7ffeefbff41e
0x7ffeefbff41e
0x7ffeefbff408
레퍼런스의 방식.
int main() {
int a = 1;
int b = 2;
// 레퍼런스는 선언과 동시에 초기화가 되어야한다. 단, 예외로 클래스의 멤버변수일 때에는 초기화리스트 이용해 초기화 가능하다.
int& c = a;
c = 3;
c = b; // b의 별명으로 바뀌는게 아니라, b의 값이 들어가는것.
/*
레퍼런스는 한번 바인딩 되면 고정. int z = 10; int& x = y; 했으면, x = z 할 경우 y에 10이 들어가는것.
포인터는 주소값을 계속 바꿀 수 있음. int z = 10; int* x = &y; 했다가 x = &z 해서 주소를 바꾸면서 포인팅을 바꿀 수 있듯.
*/
c = 4;
cout << c << endl;
cout << a << endl;
}
const 키워드 붙일 시, 마찬가지로 해당 변수 수정 불가.
int main() {
int a = 1;
int b = 2;
const int& c = a;
c = 3; // 불가
}
a를 통해서는 바꿀 수 있음.
일반 레퍼런스 변수는, 상수 초기화를 할 수 없다. 기본적으로 변수의 별명이니까.
int main() {
int a = 1;
int b = 2;
int& c = 3; // 불가
}
하지만 const를 붙여주면 가능하다는 예외가 있다.
const int& c = 3; // 가능
이렇게 const를 붙여주면 레퍼런스 변수도 상수를 참조하게 할 수 있다.
반응형
'[C++]' 카테고리의 다른 글
[C++] Lambda Expression (0) | 2021.06.24 |
---|---|
[C++] 함수 포인터 (0) | 2021.06.24 |
[C++] ENUMERATION (0) | 2021.06.24 |
[C++] 구조체 크기 관련 (0) | 2021.06.23 |
[C++] 공용체. Union, 주의점!! (0) | 2021.06.22 |