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
반응형