씹어먹는 C++
3장 c++ 참조자 래퍼런스 30p ~ 46p
diff | pointer | reference |
---|---|---|
사용법 | * ( 변수이름 ) | ( 타입 )& |
or ( 타입 )* | or &( 변수이름 ) | |
개념 | 주소값 저장 | 별명으로 해당 주소값 사용 |
사용 이유 | 불필요한 &, * 사용이 줄어듦 | |
정의 시 | 변수 명시 불필요 | 반드시 변수 명시 |
참조 변경 | 다른 주소값으로 가능 | 변경 불가능 |
메모리 할당 | 공간 할당 | 컴파일러 구현에 따라 다름 |
배열 생성 | 가능 | 불가능 |
실제 변수를 넘기는 것과 같다
int change_val(int &p) {
p = 3;
return 0;
}
int main() {
int number = 5;
std::cout << number << std::endl;
change_val(number);
std::cout << number << std::endl;
}
result
5
3
원한다면 const 사용
// do not use
int &ref = 4;
// use
const int &ref = 4;
메모리 상 존재하지 않을 수 있으므로
하지만 배열의 레퍼런스 생성은 가능
포인터와 다르게 반드시 크기 명시
int arr[3] = {1, 2, 3};
int(&ref)[3] = arr; // refenence 크기 반드시 명시
ref[0] = 2;
ref[1] = 3;
ref[2] = 1;
함수 사용시 지역변수 레퍼런스를 리턴하게 되면 함수 종료 후 사라지기 때문에 reference가 참조 할 것이 사라지게 된다.
오류를 피하기 위해 이왕이면
외부 변수 레퍼런스로 리턴 하자
만약 다른 타입으로 return 하고 레퍼런스로 받는 다면 컴파일 오류가 발생한다.
const를 사용하면 가능 하나 사라지기 전까지만 사용 가능 하다.