본문 바로가기

Windows Developer/C++

[C++]상수 함수

1. 상수 함수의 기본 개념

C++ 에서는 멤버 함수뒤에 const를 붙일수가 있습니다. 일명 상수 함수라고 부르는 문법입니다.
 
상수함수안 에서는 모든 멤버를 상수 취급합니다. 즉, 멤버 data의 값을 읽을 수는 있지만 변경할 수는 없습니다. 아래 코드를 보세요

왜, 이런 상수 함수가 필요 할까요 ? 많은 책에서는 "안정성 때문에 사용한다" 라고 이야기 하지만 상수 함수가 꼭 필요한 경우가 있습니다.




2. 상수 객체와 멤버 함수

객체를 생성할 때 상수로 만들수가 있습니다. 다음의 경우를 생각해 보도록 하겠습니다.

 
 

당연히 A는 상수 객체의 값을 변경하려고 하고 있으므로 에러가 발생합니다. B는 어떨까요 ?
멤버 Data를 직접 접근하는 것이 아니라 Set()이라는 함수를 호출하고 있습니다. 이 경우 Set을
호출하게 되면 객체의 상태가 바뀌가 되므로 역시 컴파일시에 에러가 발생하게 됩니다.

 
그렇다면 C는 어떨까요 ? Print 라는 멤버 함수 안에서는  객체의 상태(x, y의 값)을 변경하는 코드가
없습니다. 컴파일러가 허용해 줄까요 ? 하지만 컴파일러는 Print()함수의 모든 내용을 살펴 볼수가
없습니다. 즉, 객체의 상태가 변하는 지 변하지 않는지를 판단할 길이 없습니다. 그래서 무조건 에러를
 발생시킵니다.
 
여기서 중요한 사실은 상수 객체는 일반 멤버 함수를 호출할 수 없다는 것입니다.
고정된 점(Point) 은 상태를 바꿀 수는 없지만(즉, Set은 호출할 수 없지만) 좌표를 출력해(Print()함수
 호출)볼 수는 있어야 되지 않을까요 ?


3. 객체와 상수 함수

상수객체로 특정 멤버 함수를 호출하려면 해당 멤버 함수가 객체의 상태를 변경하지 않는다고 컴파일러
에게 명시적으로 알려 주어야 합니다. 즉, 상수 함수로 만들어야 합니다.

이처럼 상수 객체를 고려 한다면 객체의 상태가 변하지 않는 함수는 반드시 상수 함수로 만들어야
합니다.
 


4. 간단한 예제


C++에서는 함수를 만들때 객체가 인자로 전달된다면 값 보다는 const의 참조를 사용하는 것이
좋습니다.(메모리 사용량이 줄고, 복사 생성자의 호출을 막을수 있습니다.) 아래 예제를 살펴
보겠습니다.





main 함수에서 생성한 Rect 객체 r은 분명 상수 객체는 아닙니다. 하지만 foo 함수로 전달하는데 
foo 함수에서는 성능 문제로 const
&로 전달 받았습니다. 이제 r의 면적을 구하려고 하고 있습니다.
될까요?
 

당연히 const참조로 받았으므로 객체의 상태를 변경할 수는 없습니다. 하지만 사각형의 면적은 구할
 수 있어야 되지 않을까요 ?

따라서 GetArea() 멤버 함수는 사각형의 상태를 변경하는 것은 아니므로 반드시 상수 함수로 구현해야
 합니다.
 
결국 정리하면,

"객체의 상태를 변경하지 않은 멤버 함수는 반드시 상수함수로 만들어야
한다."




5. 문접적 특징

동일 이름의 상수함수와 비 함수를 만들 수 있습니다.



상수 멤버 함수를 선언과 구현으로 분리할 경우 반드시 선언과 구현에 모두 const를 붙여야 합니다.




이외에 상수 함수는 
mutable 지시어와도 관련이 있습니다

'Windows Developer > C++' 카테고리의 다른 글

[C++] 가상함수  (0) 2010.07.26
[C++]템플릿(template)  (0) 2010.07.20
[C++]STL 표준 C++ 라이브러리  (0) 2010.07.20
[C++]객체지향 프로그램의 4대 특징  (0) 2010.07.17
[C++] 절차지향 vs 객체지향  (2) 2010.07.17