C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 강좌/문서
C++Builder Programming Tutorial&Docments
[198] mutable 키워드. const 객체의 멤버함수 만들기 그 2번째
Lyn [tohnokanna] 16207 읽음    2009-05-13 11:05
이 글은 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 을 붙이면 회피할 수 있다

+ -

관련 글 리스트
198 mutable 키워드. const 객체의 멤버함수 만들기 그 2번째 Lyn 16207 2009/05/13
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.