2009. 7. 16. 06:37

참조자와 포인터의 사용 구분

다음과 같은 경우 참조자를 사용한다.

  • 참조하고자 하는 객체가 항상 유효한 객체일 때,
  • 다른 객체를 참조할 일이 없을 때,
  • 포인터를 사용하면 문법상 의미가 어색할 때,

이 세 가지의 경우를 제외하고는 무조건 포인터이다.

자세히 살펴보자.

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;

ps = &s2;

3.    포인터를 사용하면 문법상 의미가 어색할 때,

가장 흔한 예로 operator[] 를 구현할 때이다. 만약 operator[] 가 포인터를 반환한다고 하면 아래처럼 조금 어색한 형태가 쓰일 것이다.

vector<int> v(10);

 

// v는 포인터의 벡터가 아님에도 불구하고 포인터의 벡터인 것 처럼 보이게 한다.

*v[5] = 10;

고로, operator[] 는 참조자를 반환하도록 구현한다.

vector<int> v(10);

 

v[5] = 10;

참고 : More Effective C++