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;
};

카테고리:

업데이트:

댓글남기기