const 들이대기(effective c++ 03)
2015. 7. 27. 03:45ㆍ프로그래밍/Effective C++
728x90
728x90
const는 팔방미인
의미적인 제약을 소스 코드 수준에서 붙일 수 있다.
const 키워드가 붙은 객체는 외부 변경을 불가능하게 하고,
컴파일러가 이 제약을 단단히 지켜준다.
주의점
상수객체와 비상수객체는 함수의 오버로딩 대상에 포함된다.
상수 멤버 함수의 반환값이 참조자라면, 상수형 참조자를 반환 할 수 있게 만들어야 한다.
(기본제공 타입을 반환하는 함수의 반환값 수정은 공통적으로 불가능 하다는 규칙을 따르기 위함)
1 2 3 4 5 | char *p = greeting; //비상수 포인터, 비상수 데이터 const char *p = greeting; //비상수 포인터, 상수 데이터 char const *p = greeting; //비상수 포인터, 상수 데이터 char * const p = greeting; //상수 포인터 , 비상수 데이터 const char * const p = greeting; //상수 포인터 , 상수 데이터 | cs |
const 키워드가 * 표의 왼쪽에 있으면 포인터가 가리키는 대상이 상수
const 키워드가 * 표의 오른쪽에 있으면 포인터 자체가 상수
STL 반복자의 const
iterator 는 포인터를 본뜬 것이고 기본적인 동작원리는 T* 포인터와 같다.
1 2 | const vector::iterator iter = vec.begin(); // T* const 처럼 동작 vector::const_iterator cIter = vec.begin(); // const T* 처럼 동작 | cs |
iterator 를 const 로 선언하는 것은 포인터를 상수로 선언하는 것
(T* const 포인터)과 같다.
변경이 불가능한 객체를 가리키는 iterator( const T* 포인터 )가 필요하다면 const_iterator 를 쓰면 된다.
함수 선언에서의 const
1 2 3 4 5 | class Test{…}; Test operator* (Test& a, Test& b); … (a * b) = c; // (a * b)의 리턴이 상수가 아닌 객체이므로 대입가능 | cs |
함수 반환값을 상수로 하지 않으면 사용자 측에서 생각지도 못한 에러가
생길 수 있다.
상수 멤버의 장점
- 변경되지 않는 값은 상수로 명확히 표시되므로 클래스의 인터페이스를 직관적으로 이해할 수 있게 된다.
- 객체 전달을 상수 객체에 대한 레퍼런스로 할 경우, 쓸데없는 복사가 일어나지 않으므로 실행 성능을 높일 수 있다.
비트수준 상수성
멤버 함수가 그 객체의 어떤 데이터 멤버도 건드리지 않아야(정적 멤버 제외) 그 멤버 함수가 'const' 이다
즉, 멤버 함수가 객체의 구성요소들 중 아무것도 건드리지 말아야 한다
논리적 상수성
일부 몇 비트는 바꿀 수 있되, 그것을 사용자 측에서만 알아채지 못하게 하면 상수 멤버의 자격이 있다.
728x90
반응형
'프로그래밍 > Effective C++' 카테고리의 다른 글
참조자 전달 선호하기(effective c++ 20) (0) | 2015.07.28 |
---|---|
디폴트들 사용금지령(effective c++ 06) (0) | 2015.07.27 |
컴파일러의 디폴트 제공 함수들(effective c++ 05) (0) | 2015.07.27 |
#define 안녕(effective c++ 02) (0) | 2015.07.27 |
C++은 연합체로 바라보자(effective c++ 01) (0) | 2015.07.27 |
객체 복사(effective c++ 12) (0) | 2015.07.26 |
(작성중)배열 vs 다형성(more effective c++ 03) (0) | 2015.07.25 |