다음과 같은 경우 참조자를 사용한다.
이 세 가지의 경우를 제외하고는 무조건 포인터이다.
자세히 살펴보자.
1. 참조하고자 하는 객체가 항상 유효한 객체일 때
참조자에서는 “널 참조자(null reference)”가 없다. 그래서 널 테스트를 할 필요가 없다.
포인터라면 아래처럼 null test 를 해야 하지만,
참조자는 아래와 같이 구현한다.
2. 다른 객체를 참조할 일이 없을 때
포인터는 다른 객체의 주소값으로 얼마든지 바꿀 수 있지만, 참조자는 초기화될 때의 객체만 참조한다.
3. 포인터를 사용하면 문법상 의미가 어색할 때,
가장 흔한 예로 operator[] 를 구현할 때이다. 만약 operator[] 가 포인터를 반환한다고 하면 아래처럼 조금 어색한 형태가 쓰일 것이다.
고로, operator[] 는 참조자를 반환하도록 구현한다.
참고 : More Effective C++
- 참조하고자 하는 객체가 항상 유효한 객체일 때,
- 다른 객체를 참조할 일이 없을 때,
- 포인터를 사용하면 문법상 의미가 어색할 때,
이 세 가지의 경우를 제외하고는 무조건 포인터이다.
자세히 살펴보자.
1. 참조하고자 하는 객체가 항상 유효한 객체일 때
참조자에서는 “널 참조자(null reference)”가 없다. 그래서 널 테스트를 할 필요가 없다.
포인터라면 아래처럼 null test 를 해야 하지만,
void printDouble(const double * pd) { if(pd) { // Null test cout
<< *pd; } |
참조자는 아래와 같이 구현한다.
void printDouble(const double & rd) { cout
<< rd; |
2. 다른 객체를 참조할 일이 없을 때
포인터는 다른 객체의 주소값으로 얼마든지 바꿀 수 있지만, 참조자는 초기화될 때의 객체만 참조한다.
string s1("Nancy"); string s2("Clancy"); string & rs = s1; // &rs
= s2; // 에러 string * ps = &s1; |
3. 포인터를 사용하면 문법상 의미가 어색할 때,
가장 흔한 예로 operator[] 를 구현할 때이다. 만약 operator[] 가 포인터를 반환한다고 하면 아래처럼 조금 어색한 형태가 쓰일 것이다.
vector<int> v(10); // v는 포인터의 벡터가 아님에도 불구하고 포인터의 벡터인 것 처럼 보이게 한다. |
고로, operator[] 는 참조자를 반환하도록 구현한다.
vector<int> v(10); |
참고 : More Effective C++