3. 낌새만 보이면 const를 들이대 보자
Posted 2012. 10. 17. 18:40const : 어떤 값이 변하지 않는 상수화를 할 때 앞에 붙여주는 키워드 이다.
char *p = abc; // 비상수 포인터, 비상수 데이터
const char*p = abc; // 비상수 포인터, 상 수 데이터
char * const p = abc; // 상 수 포인터, 비상수 데이터
const char * const p = abc; // 상 수 포인터, 상 수 데이터
const 키워드가 *의 왼쪽에 있으면 포인터가 가르키는 대상이 상수이며 오른쪽에 있으면
포인터 자체가 상수이며 양쪽 다 있으면 둘다 상수 이다.
그리고
void a1( const abc *pw ); // a1은 상수 abc객체에 대한 포인터를 매개변수로 취한다
void a2( abc const *pw ); // 위와 동일
함수의 반환값을 상수로 정해주면 사용자측의 에러를 줄이는 효과가 있다.
const ABC operator* ( const ABC& aa, const ABC& bb ); 이렇게 정의해 두면
ABC a,b,c;
a * b가 c와 같은지 알려고 작성하던중 실수로
if( a * b = c ); 이렇게 대입연산을 하게 될 경우를 방지 할 수 있다.
◎ 비트수준 상수성
어떤 멤버 함수가 그 객체에 어떤 데이터 멤버도 건드리지 않아야 한다. 그 객체를 구성하는 비트들 중 어떤 것도 바뀌면 안된다는 것이다. C++에서 사용하는 상수 수준이다.
◎ 논리적 상수성
상수 멤버 함수라고 해서 객체의 한 비트도 수정 할 수 없다는 것이 아니라 일부 몇 비트정도는 바꿀수 있되 그것을 사용자측에서 알아채지 못하게만 하면 상수 멤버 자격이 있다는 것이다.
mutable 키워드를 이용하면 비트 수준의 상수성을 풀어 줄 수 있다.
< const를 붙여 선언하면 컴파일러가 사용상의 에러를 잡아내는데 도움을 준다. >
< const는 어떤 유효범위에 있는 객체에도 붙을수 있다. 함수 매개변수, 반환타입, 멤버함수 >
< 컴파일러 쪽에서 보면 비트수준 상수성을 지켜야 하지만, 논리적인 상수성을 사용해서 작성해야 한다 >
< 상수 멤버 및 비상수 멤버가 기능적으로 서로 똑같게 구현 되어 있을 경우 코드 중복을 피하는 것이
좋다. 이때 비상수 버전이 상수버전을 호출하도록 만들면 된다 >
'BOOK > Effective C++ 3판' 카테고리의 다른 글
7. 다형성을 가진 기본 클래스에서는 소멸자를 반드시 virtual로 (0) | 2012.10.18 |
---|---|
5. C++이 은근슬쩍 만들어 호출해버리는 함수들에 촉각을 세우자 (0) | 2012.10.17 |
4. 객체를 사용하기 전에 반드시 그 객체를 초기화 하자 (0) | 2012.10.17 |
2. #define을 쓰려거는 const,enum,inline을 떠올리자 (0) | 2012.10.17 |
1. C++ 언어들의 연합체로 바라보는 안목은 필수 (0) | 2012.10.17 |
- Filed under : BOOK/Effective C++ 3판