const란 const로 정의된 변수를 상수화하여, 그 값을 변경하지 못하게 하는 것이다.
변경하지 않아야 하는 변수를 수정하여, 난 에러는 찾기가 매우 힘들다. 이러한 변수사용시 그값이 변경되지 않아야 하는 곳에 사용하여, 그러한 에러를 컴파일시 확인이 가능하게 하게 한다.
#변수의 상수화
const [변수 타입] [변수명] = 초기화 값 ; //선언시 초기화 값을 넣어야 된다. 초기화 값을 넣은 후 변경을 할 수 없다.
ex>
const int A = 12345; //A를 상수화하여 12345값으로 상수화(고정)된다.
const float B = 123.45; //B를 상수화하여 123.45값으로 상수화(고정)된다.
const [변수 타입] * [변수명]; //변수명이 가리키는 주소의 값을 변경할 수 없다.
ex>
const int * pA;
int a = 3;
pA = &a; //pA에 a의 주소값을 넣는다.
*pA = 10; //컴파일 에러 : pA가 가리키는 주소의 값이 상수화 되어 변경할 수 없다.
[변수 타입] * const [변수명] = 초기화 값; //변수명이 가리키는 주소를 변경할 수 없다.
ex>
int a;
int * const pA = &a;
pA = &a; //컴파일 에러 : pA가 가리키는 주소가 상수화되어 변경할 수 없다.
*pA = 10; //pA가 가리키는 주소의 값을 변경한다.
const [변수 타입] * const [변수명] = 초기화 값; //변수명이 가리키는 주소와 그주소의 값도 변경할 수 없다.
ex>
int a;
const int * const pA = &a;
pA = &a; //컴파일 에러 : pA가 가리키는 주소가 상수화되어 변경할 수 없다.
*pA = 10; //컴파일 에러 : pA가 가리키는 주소의 값이 상수화 되어 변경할 수 없다.
a = 3; //이렇게 직접 값을 변경하는 수 밖에 없다.
#멤버함수의 상수화
[리턴타입] [함수명] (매개변수) const {함수내용...}; //해당 함수안에서는 클래스의 모든 멤버 변수는 상수화되어 값을 변경할 수 없고, 포인터 반환이 되지 않는다. 또한 멤버함수의 경우 같이 상수화된 함수만을 사용할 수 있다.
ex>
int a; //멤버 변수
void FunctionA(Test * pTest) const; //상수화된 멤버 함수
void FunctionB(int b) { b = 1; }; //일반 맴버 함수
void FunctionC(int c) const { c = 1; }; //상수화된 멤버 함수
void Test::FunctionA(Test * pTest) const
{
int b = 1; //내부에 선언한 변수의 값을 변경 할 수 있다.
a = 1; //컴파일 에러 : 멤버변수 값을 변경 할 수 없다.
pTest->a = 1; //클래스 포인터를 사용하여 멤버 변수의 값을 변경 할 수 있다. 그러나 이것은 바람직하지 않은 사용이다. 이렇게 사용할 바에는 그냥 일반함수로 만들어 사용하는 게 낮다.
FunctionB(2); //컴파일 에러 : 상수화가 안된 맴버함수를 사용할 수 없다.
FunctionC(2); //상수화된 멤버함수로 컴파일된다.
}
#const와 함수 오버로딩
const 사용에 따라 동일한 함수명과 동일한 매개변수를 가지고 있다하여도 함수오버로딩이 가능하다.
ex>
void FunctionA(void); //일반 함수
void FunctionA(void) const; //const를 사용한 함수오버로딩된 상수 함수
void FunctionB(void)
{
FunctionA(); //일반 함수가 실행된다. 상수함수도 실행할 수 있지만 우선순위가 일반함수가 더 높다.
}
void FunctionC(void) const
{
FunctionA(); //상수 함수가 실행된다. 오직 상수함수만을 실행 할 수 있다.
}