2012년 8월 9일 목요일

const 맴버 함수에 대한 이해

가끔 MFC나 혹은 그 밖이 다른 소스를 보면 다음과 같은 맴버 함수들을 볼 수 있다.


class CPeople
{
public:
 CPeople() : m_nAge(5) {;}
 ~CPeople() {;}
 void SetAge(const int& Age) { m_nAge = Age; }
 int  GetAge () const
 {
  return m_nAge;
 }

private:
 int m_nAge;
};

자주는 봤지만 그 의미 파악을 하지는 않고 넘어간 경우가 있어 이번 기회에 확실하게 개념을 파악을 해야 겠다.

기본적으로 const는 상수성을 지닌다는 키워드인데 저렇게 맴버 함수에 const가 붙은 경우는
'이 맴버 함수는 상수 객체에 대해 호출되는 함수이다'라는 의미를 지니게 된다.
또 한 const 키워드가 맴버 함수에 붙음으로서 이 함수 안에서 사용하는 모든 맴버 변수들은 const 키워드가 붙지 않아도
상수성을 지닌다.

다음의 예를 보자
class CPeople
{
public:
 CPeople() : m_nAge(5) {;}
 ~CPeople() {;}
 void SetAge(const int& Age) { m_nAge = Age; }
 int  GetAge () const
 {
    m_nAge = 5;  // 컴파일 오류 맴버 변수는 상수성을 가지게 된다.
    int vale = 5;  // 이건 가능 지역 변수는 상수성을 지니지 않는다. 
    return 1;
 }
 private:
 int m_nAge;
}

GetAge()라는 함수 뒤에 const 키워드가 붙음으로 인해 이 맴버 함수안에 들어 있는 맴버 변수들은 상수성을 가지므로 이 맴버 함수 안에서 맘음대로 맴버변수의 값을 바꾸는건 불가능하게 된다. 

또한 클래스의 객체가 만약 상수 객체라고 한다면 const 맴버 함수만을 호출 할 수 있다.
무슨 말인지는 다음 예를 보면 간단하게 파악이 가능하다.


위와 같이 같은 GetAge()함수지만 하나는 상수 맴버 함수 다른 하나는 비상수 맴버 함수라고 오버로딩 하여 선언하였다.

위와 같이 보통 객체의 경우 GetAge()를 호출하는 경우 비상수 맴버인 GetAge()가 호출이 된다.

하지만 다음과 같은 상수 객체일 경우 GetAge() const 인 상부맴버함수가 불리게 된다.


그럼 저렇게 각 함수에 대해 오버로딩 되어 있지 않고 상수맴버함수만 정의 해놓았을 때는 어떻게 될까?

일반적으로 비상수 객체가 상수맴버 함수의 호출은 가능하다.
하지만 상수객체가 비상수맴버 함수 호출은 불가능하다.

즉 상수객체는 상수맴버 함수만 호출 할 수 있다는 것이고,
비상수 객체는 상수맴버함수, 비상수맴버함수 모두 호출이 가능하다는 뜻이다.



위의 예 처럼 상수 객체가 비 상수 객체를 호출하는 경우 이런경우는 Error이 발생하게 된다.


출처:http://sanaigon.tistory.com/99

댓글 없음: