일반적으로 const는 해당 변수를 상수화 한다고한다. (값의 변경 불가)
하지만 쓰이는 곳에따라 의미가 조금씩 다르다고 할 수 있다.
기본자료형 변수 에서의 const
const int num = 10;
num 변수는 상수화 되어 다른값의 대입이 불가능 하다.
num = 20; 같은 대입이 불가능하다. (값을 가져와 쓰는것만 가능하다.)
변수 생성과 동시에 값이 초기화 되어야한다.
const int num; // 불가능 초기화값이 존재하지 않는다.
const int num = 20; // 가능 초기화값이 존재한다.
포인터 에서의 const
const가 포인터 앞에붙냐 뒤에붙냐에 따라 나뉘게 된다.
const int* pNum = #
pNum 변수를 참조해서 값의변경이 불가능 하다.
*pNum = 10; 불가
num변수를이용하여 값을 변경 하는것은 가능하다.
num = 10; 가능
int* const pNum = #
포인터 변수 pNum에 다른 주소값으로 변경이 불가능 하다.
pNum = &num2; 불가
pNum 변수를 참조해서 값의 변경은 가능
*pNum = 20; 가능
물론 위의 두개를 동시에 사용할 수 도 있다. (위두가지 특성을 모두 가지게 된다)
const int* const pNum = #
예제 클래스
class SimpleClass
{
public:
int num1;
int num2;
SimpleClass()
: num1( 0 ), num2( 0 )
{
}
int Function1()
{
num1 += 10;
return num1;
}
int Function2() const
{
// 이함수 내에서 멤버변수의 변경 불가
return num2;
}
};
const 멤버함수
class의 const 멤버함수는 함수내에서 멤버변수의 값이 변경되는것을 막는다.
또한 외부에서 멤버변수의 변경가능성이 존재하는 포인터, 레퍼런스로 리턴하는것도 불가능 하다.
함수이름 뒤쪽에 const를 붙여준다.
int Function2() const
{
return num2;
}
다음과 같은 멤버변수 변경이 불가능 하다.
int Function2() const
{
num2 += 10; // 불가능
return num2;
}
객체에서의 const
const 객체는 멤버변수 값의 변경이 불가능하며 const 멤버 함수만 호출 가능 하다.
const SimpleClass* simple1 = new SimpleClass;
simple1->Function1() // 불가능
simple1->Function2() // 가능
simple1->num1 = 10; // 불가능
mutable
해당멤버 변수는 const멤버함수 내에서의 값의 변경이 허용된다.
멤버변수 num2 가 mutable int num2; 으로 선언되어있다면 불가능 했던 아래코드가 가능하다.
int Function2() const
{
num2 += 10; // 가능
return num2;
}
const 함수가 무의미해질 수 있기 때문에 특별한 경우가 아니라면 사용을 안하는 것이 좋다.
const_cast
c++에서 추가된 형변환 연산자이다.
포인터와 참조자의 const를 제거 하는 목적으로 사용된다.
const 를 사용하게되면 위에서봤던 제약조건들이 생기게된다.
유일하게 const_cast로 const 성향을 없애줄 수 있다.
const SimpleClass* simple1 = new SimpleClass;
SimpleClass* simple2 = const_cast<SimpleClass*>(simple1); // const가 제거된다
simple2->Function1(); // const가 제거되었기 때문에 const멤버함수가 아닌 함수도 호출가능
simple2->num1 = 5; // const가 제거되었기 때문에 public 멤버 변경가능
무분별한 사용은 const를 무의미하게 하기때문에 특별한 용도로만 쓰는 것이 좋다.
const의 중요성