const
effectice c++을 보고 상수 멤버 함수에 관해 조금 더 공부를 해봤다.
상수 멤버 함수
-
멤버 함수에
const
가 있다는 것은 해당 멤버 함수가 상수 객체에 대해 호출될 함수임을 의미한다. - 또한 상수 멤버함수 안에서는 모든 멤버를 상수 취급한다.
- 멤버 데이터 값을 읽을 수 있지만 변경이 불가능하다.
- 상수 멤버 함수를 만들기 위해서 정의와 선언에서 모두
const
를 표기해야한다.
class A{
public:
void Output() const;
};
A::Output() const{
// TODO
}
-
객체의 상태를 변경하지 않는 모든 멤버 함수는 반드시 상수 멤버 함수로 만들어야 한다.
- 어떤 함수의 매개변수가
const
라면(call by value가 아닌 call by reference)- 해당 매개변수 객체의 멤버 함수를 사용할 상황이라면, 해당 멤버 함수를 상수 멤버 함수로 만들어줘야한다.
- 옛날에 c++ call by reference 실습하는 과정에서
const
때문에 비상수 멤버 함수 호출이 안 된 적이 있었다.- 그 때는 매개변수의
const
를 삭제했었는데, 이제는 call by reference를 호출하는 상황을 위해 상수 멤버 함수를 만들자.
- 그 때는 매개변수의
class A {
public:
int GetNum() { return num; }
private:
int num;
};
void Func(const A& a) {
int x = a.GetNum(); // const 때문에 오류가 발생한다
} // 이를 위해 상수 멤버 함수를 만들어주면 된다.
- 당연하지만 티런하는 타입이
const
일 경우, 함수 리턴 타입도const
로 되어야 한다.- 그렇지 않으면 에러가 난다.
상수 객체, 비상수 객체의 우선 순위
- 상수 객체와 비상수 객체가 있고, 상수 멤버 함수와 비상수 멤버 함수가 오버로드되어 있다면 각각 맞는 멤버 함수를 호출한다.
- 만약 비상수 멤버 함수가 없다면, 비상수 객체는 그냥 상수 멤버함수를 호출하게 된다.
- 하지만 반대로 상수 멤버 함수가 없다면, 상수 객체에서 함수 호출 오류가 발생한다.
mutable
- 상수 멤버 함수 안에서 모두가 상수로 취급되기에 변경이 불가능하다.
- 하지만 상수 멤버 함수 안에서 멤버를 변경해야 한다면 어떻게 해야하는가?
- 멤버를
mutable
로 만들어주면 된다.
class A {
public:
int IncreaseNum() const { return num++; } // 상수 멤버 함수이지만 멤버 변수를 변경할 수 있다.
private:
mutable int num;
};
댓글남기기