본문 바로가기
Programming/Effective C++ 3판

항목 3. 낌새만 보이면 const를 들이대 보자!

by deviAk 2008. 6. 10.
반응형

const 사용처

클래스 바깥에서는 전역 혹은 네임스페이스 유효범위의 상수를 선언(정의)하는 데 쓸 수 있다.
파일, 함수, 블록 유효범위에서 static으로 선언한 객체에도 const를 붙일 수 있다.
클래스 내부의 경우 정적 멤버 및 비정적 데이터 멤버 모두를 상수로 선언할 수 있다.

char greeting[] = "Hello";

char  *p = greeting;         // 비상수 포인터, 비상수 데이터
const char *p = greeting;       // 비상수 포인터, 상수 데이터
char * const p = greeting;      // 상수 포인터, 비상수 데이터
const char * const p = greeting;   // 상수 포인터, 상수 데이터

void f1(const Widget *pw);   // f1은 상수 Widget 객체에 대한 포인터를 매개 변수로 취한다.
void f2(Widget const *pw);   // f2도 f1과 동일하다.

std::vector<int> vec;
...
const std::vector<int>::iterator iter = vec.begin();
                 // iter는 T* const처럼 동작한다.
*iter = 10;             // OK, iter가 가르키는 대상을 변경한다.
++iter;              // Error! iter는 상수이다.

std::vector<int>::const_iterator cIter = vec.begin();
                 // cIter는 const T*처럼 동작한다.
*cIter = 10;            // Error! *cIter가 상수이다.
++cIter;               // OK, 문제 없다.

이것만은 잊지 말자!
- const를 분텨 선언하면 컴파일러가 사용상의 에러를 잡아내는데 도움을 준다. const는 어떤 유효범위에 있는 개체에도 붙을 수 있으며, 함수 매개변수 밑 반환 타입에도 붙을 수 있으며, 멤버 함수에도 붙을 수 있다.
- 컴파일러 쪽에서 보면 비트수준 상수성을 지켜야 하지만, 개념적인(논리적인) 상수성을 사용해서 프로그래밍해야 한다.
- 상수 멤버 및 비상수 멤버 함수가 기능적으로 서로 똑같게 구현되어 있을 경우에는 코드 중복을 피하는 것이 좋은데, 이때 비상수 버전이 상수 버전을 호출하도록 만든다.

관련링크
http://ikpil.tistory.com/402
반응형