voidprint()const{ x = 10; //error, 상수 함수 안에서는 멤버 값을 변경할 수 없다. cout << x << ", " << y << endl; } };
intmain(){ const Point p(0, 0);
p.x = 10; // error : 상수 인스턴스 이기때문이다. p.set(10, 10); // error : 객체를 상수화를 하였기 때문에 상수함수만 가능하다. // 위에 2가지는 불가능 하더라고 밑에 print는 가능 해야한다. 이럴때 필요한것이 const이다 p.print(); return0; }
2. 상수 함수 호출
아무리 상수객체라고 하더라고 호출이 가능하도록 열어 둬야 한다. 핵심 : 상수 함수는 필수이다. 객체의 상태를 변경하지 않은 모든 멤버 함수는 반드시 상수함수로 만들어야 한다. void foo(const Rect& r) 코드에서 r에 대해서 면적은 구할수 있어야 한다!!
위와 같이 했을 때는 매 번 cache를 생성해서 작성하게 된다. 이 부분에 대해서 불필요 하다고 생각 되기 때문에 다음과 같이 수정을 한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14
classPoint { int x, y; char cache[32]; bool cache_valid; public : Point(int a = 0, int b = 0) : x(a), y(b), cache_valid(false) { } char *toString(){ if (cache_valid == false) { sprintf(cache, "%d, %d", x, y); cache_valid = true; } return cache; } };
위와 같이 수정하였을 경우 cache에 대해서 매번 생성하는 불필요한 행위는 안 할 수있으나 문제가 있다.
실제로 멤버 x, y의 값은 변경하지는 않지만 cache_vaild를 수정하기 때문에 const를 붙일수가 없다. 논리적으로 봤을 때 cache와 cache_valid는 직접적으로 영향을 끼치는 역활이 아니라 도우미 역활이기때문에 const를 붙이는 것이 맞다. 이런한 점을 해결하기 위한 2가지 방법을 살펴보자.