검색결과 리스트
글
const 사용처
클래스 바깥에서는 전역 혹은 네임스페이스 유효범위의 상수를 선언(정의)하는 데 쓸 수 있다.
파일, 함수, 블록 유효범위에서 static으로 선언한 객체에도 const를 붙일 수 있다.
클래스 내부의 경우 정적 멤버 및 비정적 데이터 멤버 모두를 상수로 선언할 수 있다.
char greeting[] = "Hello";
char *p = greeting; // 비상수 포인터, 비상수 데이터
const char *p = greeting; // 비상수 포인터, 상수 데이터
char * const p = greeting; // 상수 포인터, 비상수 데이터
const char * const p = greeting; // 상수 포인터, 상수 데이터
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과 동일하다.
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 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
'Study > Effective C++ 3판' 카테고리의 다른 글
| 항목 11. operator=에서는 자기대입에 대한 처리가 빠지지 않도록 하자 (0) | 2009/02/17 |
|---|---|
| 항목 10. 대입 연산자는 *this 참조자를 반환하게 하자 (0) | 2009/02/15 |
| 항목 9. 객체 생성 및 소멸 과정 중에는 절대로 가상 함수를 호출하지 말자. (0) | 2009/02/15 |
| 항목 8. 예외가 소멸자를 떠나지 못하도록 붙들여 놓자. (0) | 2008/07/10 |
| 항목 7. 다형성을가진 기본 클래스에서는 소멸자를 반드시 가상 소멸자로 선언하자. (0) | 2008/07/01 |
| 항목 6. 컴파일러가 만들어낸 함수가 필요 없으면 확실히 이들의 사용을 금해 버리자. (0) | 2008/06/27 |
| 항목 5. C++가 은근슬쩍 만들어 호출해 버리는 함수들에 촉각을 세우자 (0) | 2008/06/27 |
| 항목 4. 객체를 사용하기 전에 반드시 그 객체를 초기화하자. (0) | 2008/06/10 |
| 항목 3. 낌새만 보이면 const를 들이대 보자! (0) | 2008/06/10 |
| 항목 2. #define을 쓰려거든 const, enum, inline을 떠올리자. (0) | 2008/05/29 |
| 항목 1. C++를 언어들의 연합체로 바라보는 안목은 필수 (1) | 2008/05/28 |

RECENT COMMENT