2011. 3. 7. 21:13
const 멤버함수
멤버함수에 const 키워드를 붙여주는것은,
=> "멤버 함수를 상수화 하겠다."는 뜻.
멤버 함수가 상수화 되면, 이 함수를 통해서 멤버 변수의 값이 변경되는 것을 허용하지 않는다.!



int* GetPtr() const{
    return &cnt;
}      //컴파일 요류
상수화된 함수는 상수화되지 않은 함수의 호출을 허용하지 않을 뿐만 아니라,
멤버 변수의 포인터를 리턴하는 것도 허용하지 않는다.

해결책!!!
const int* GetPtr() const{
    return &cnt;
}
=>리턴하고자 하는 포인터를 상수화해서 리턴.  포인터 자체를 상수화하는 것이 아니라, 포인터가 가리키는 데이터를 상수화는것. 따라서 이 포인터를 전달받은 영역에서는 멤버 변수를 참조할 수는 있어도 조작하는 것은 불가능.
컴파일 오류는 NO!


const객체
객체가 상수화되면,
어떠한 경로를 통해서든, 멤버 변수의 조작은 불가능.
상수화된 멤버 함수만 호출 가능.
일반 멤버함수는 멤버 변수를 조작하지 않더라도 호출 불가능!!

 #include <iostream>
using std::cout;
using std::cin;
using std::endl;

class AAA
{
 int num;
public:
 AAA(int _num) : num(_num) {}
 void Add(int n)
 {
  num+=n;
 }
 void ShowData()
 {
  cout<<num<<endl;
 }
};

int main(void)
{
 const AAA aaa(10);
 aaa.Add(10); //Compile Error
 aaa.ShowData(); //Compile Error

 return 0;
}




ShowData() 함수는 num을 조작하지 않고 단지 보여주는 역할만 한다.
ShowData()함수를 사용하고 싶을 때 => ShowData()를 상수화!

@@@ 상수함수냐 아니냐에 따라서도 함수 오버로딩은 성립! @@@
void function(int n) const {......}
void function(int n) {.....}

 #include <iostream>
using std::cout;
using std::cin;
using std::endl;

class AAA
{
 int num;
public:
 AAA(int _num) : num(_num) {}
 void Add(int n)
 {
  num+=n;
 }
 void ShowData()
 {
  cout<<num<<endl;
 }
 
void ShowData() const
 {
  cout<<"void ShowData() const 호출!!"<<endl;
  cout<<num<<endl;
 }
};

int main(void)
{
 const AAA aaa(10);
 aaa.ShowData(); //Compile Error

 return 0;
}

Posted by Triany