이 글은 Borlandforum 둘리 님의 글에 추가설명을 하기 위한 글입니다.
원본 :
http://cbuilder.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_tutorial&no=189
일단 예제코드는 아래와 같습니다.
class MyData
{
private:
int printcount;
public:
MyData()
{
printcount = 0;
}
void PrintCount()
{
printcount++;
printf("Count : %d\n", printcount);
}
};
void test(const MyData &Mydata)
{
Mydata.PrintCount();
}
int _tmain(int argc, _TCHAR* argv[])
{
MyData m;
test(m);
system("pause");
return 0;
}
이렇게 할 경우 Test를 호출 했을 때, Const 객체로는 Const 가 아닌 멤버함수를 호출 할 수 없다는 에러가 납니다.
그 해결방법 첫번째..
1. 변수의 상수성을 없앤다
test 함수를 다음과 같이 수정합니다.
void test(const MyData &Mydata)
{
const_cast<MyData*>(&Mydata)->PrintCount();
}
const_cast 로 인해 상수성이 없어지므로 바로 호출이 가능합니다.
그러나 이렇게 하면 궂이 상수 파라메터로 받은 이유가없어집니다 =_=;
2. 2번은 둘리님이 말씀하신것처럼 멤버함수를 const 로 변경하는겁니다.
void PrintCount() const
{
printcount++;
printf("Count : %d\n", printcount);
}
그런데 문제가 있습니다.
이 경우 const 함수이기 때문에 printcount++ 에서 에러가납니다.
const 함수에서는 변수의 값을 변경할 수 없습니다.
const 함수는 값이 변하지 않음을 보장해야 하는 것이니까요.
하지만 밖에서 보이지 않는 내부의 값이라면 사용자 몰래(?) 값을 수정 하고 싶을 경우가 const 함수에서도 분명히 있을겁니다. 그래서 나온 키워드가 mutable 입니다.
const 함수 내에서도 변경을 허용할 변수앞에 mutable 키워드를 추가합니다,
class MyData
{
private:
mutable int printcount; <----여기
public:
MyData()
{
printcount = 0;
}
void PrintCount() const
{
printcount++;
printf("Count : %d\n", printcount);
}
};
다시 실행 해 보면 PrintCount() 함수의 printcount++ 라인에서 에러를 내지 않습니다.
결론 : 상수멤버함수에서도 수정해야 할 변수에는 mutable 을 붙이면 회피할 수 있다