const : 어떤 값이 변하지 않는 상수화를 할 때 앞에 붙여주는 키워드 이다.


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는 어떤 유효범위에 있는 객체에도 붙을수 있다. 함수 매개변수, 반환타입, 멤버함수  >

< 컴파일러 쪽에서 보면 비트수준 상수성을 지켜야 하지만, 논리적인 상수성을 사용해서 작성해야 한다 >

< 상수 멤버 및 비상수 멤버가 기능적으로 서로 똑같게 구현 되어 있을 경우 코드 중복을 피하는 것이

좋다. 이때 비상수 버전이 상수버전을 호출하도록 만들면 된다 >