2007년 04월 05일
[C++]3. 낌새만 보이면 const 를 들이대 보자!(2)
상수 멤버 함수
멤버 함수에 붙는 const 키워드는 다음과 같은 사실을 알려 준다.
"해당 멤버 함수가 상수 객체에 대해 호출될 함수이다"
상수 멤버 함수의 중요성
1. 클래스의 인터페이스를 이해하기 좋게 한다
사용자는 클래스로 만들어진 객체를 변경할 수 있는 함수를 알고 있어야 한다.
2. 상수 객체를 사용할 수 있게 하자
객체 전달을 '상수 객체에 대한 참조자( reference-to-const )' 로 진행을 하게 되면
C++ 프로그램의 실행 성능을 높일 수 있다.
상수 멤버 함수 오버로딩
const 가 있고 없고의 차이만 있는 멤버 함수들은 오버로딩이 가능하다.
class TextBlock {
public:
…
const char& operator[] ( std::size_t position ) const //상수 객체에 대한 operator[]
{ return text[position] ; }
char& operator[] ( std::size_t position ) //비상수 객체에 대한 operator[]
{ return text[position]; }
private:
std::string text;
};
위처럼 선언된 TextBlock의 operator는 다음과 같이 사용한다
TextBlock tb ("Hello");
std::cout << tb[0]; //TextBlock::operator[] 의 비상수 멤버를 호출
const TextBlock ctb("World");
std::cout << ctb[0]; //TextBlock::operator[] 의 상수 멤버를 호출
실제 프로그램에서 상수 객체가 생기는 경우는
상수 객체에 대한 포인터 혹은 상수객체의 참조자로 객체가 전달 될 때이다.
TextBlock의 상수 객체와 비상수 객체의 쓰임새가 달라진다.
std::cout << tb[0]; // OK. 비상수 버전의 TextBlock객체를 읽음여기서 발생하는 Error는 operator[] 의 반환타입 (return type)때문에 생기게 되는 것이고tb[0] = 'x' ; // OK. 비상수 버전의 TextBlock 객체 사용
std::cout << ctb[0]; // OK. 상수 버전의 TextBlock 객체를 읽음
ctb[0] = 'x' ; // Error! 상수 버전의 TextBlock 객체에 쓰기는 안됨
operator[] 의 호출이 잘못된 것이 아니라는 것을 알아둡시다.
// const char& 타입에 대입연산을 시도하였기 때문
# by | 2007/04/05 21:07 | Effective C++ | 트랙백




