변수는 메모리의 특정위치를 가르키는 이름
레퍼런스 변수는 기존 변수에 또 다른 이름 (alias)를 부여하는 것
int n = 10;
int& r = n; //레퍼런스
std::cout<< &n << std::endl; //메모리의 주소가 출력된다
void f1(int n) {++n;}
void f2(int* p} {++(*p);}
void f3(int& r) {++r;} // int& r = c
int main()
{
f1(a); // call by value 값 변동 없음
f2(&b); // call by pointer 원본 수정가능
f3(c); // call by reference 원본 수정가능
}
레퍼런스는 포인터와 마찬가지로 원본을 수정할 떄 사용한다.
래퍼런스는 포인터보다 좀 더 간결한 코드로 사용이 가능하다.
하지만 레퍼런스는 호출자 측면에서 값 변동여부를 예측할 수 없기 때문에 가독성이 좋지 않다.
포인터와 레퍼런스
int* p1 = &n;
int& r1 = n;
int* p2 = 0; // null pointer 가능
int & r2; //error
*p1=20;
r1=20; //자동 * 연산되는 포인터
if(p1 != 0) {}
if(r1 != 0 ) {} // null이 불가능하기 때문에 조사할 필요 없다.
기존변수(메모리)를 가리킨다는 공통저밍 있지만,
포닝터는 변수 주소로 초기화해서 초기값 생략이 가능하지만,
레퍼런스는 변수 이름으로 초기화하기 떄문에 초기값이 반드시 필요하다.
'프로그래밍 > C++' 카테고리의 다른 글
[C++] static member 정적 멤버 데이터, 함수 (0) | 2021.08.19 |
---|---|
[C++] 복사생성자 (0) | 2021.08.19 |
[C++] range for, if init, switch init (0) | 2021.07.25 |
[C++] 람다표현식 (0) | 2021.07.25 |
[C++] constexpr (0) | 2021.07.25 |