2010년 2월 4일 목요일

C++ const 키워드

 

멤버함수에서의 const 의 특성(2) C++  2006/12/16 18:58 http://blog.naver.com/hacker79kr/120032397120
 
앞서...값을 리턴할 때의 멤버함수에 붙는 const 에 대해 알아보았다...

이번에는 레퍼런스를 리턴하는 경우에 대해 한번 살펴보자...

 

레퍼런스를 리턴하는 경우

 

class Test{
private :
 char Ch;
public :
 Test(const char c) { Ch = c; }

 char& GetName() { return Ch; }   <== 레퍼런스를 리턴(복사본을 리턴하지 않는다)
};

 

int main()
{
   Test Ob('C');

    Ob.GetName() = 'A';   <== 호출 결과로 원본이 넘어오므로 또다른 대입이 가능하다...

    cout<<Ob.GetName()<<endl;
    return 0;
}

 

=> 위에서 보다시피...레퍼런스(원본 대상체) 가 리턴되므로,,,컴파일러 내부적으로 복사과정을 거치지 않는다...

     주소값과 레퍼런스는 l-value (즉,,,메모리를 점유) 가 될 수 있으므로 = 대입연산자의 좌측에 올 수가 있다...

 

그럼,,,다시  char& GetName() { return Ch; } 함수를 가지고 장난을 쳐보자...

 

char& GetName() const   <== 수정불가인 함수이다...(컴파일 되지 않는다...)

{

   return Ch;

}

 

=> 수정불가인 함수에서 원본 대상체를 리턴하고 있다...

    그러나,,,값을 복사해서 리턴하는 것이 아니기 때문에...const 성질을 가지고 있어서...

    수정 불가인 멤버변수 그 자체가 리턴되어...l-value가 될 수 있는 자격을 가지고 있다.

    즉,,,리턴받는 쪽에서도 수정하지 못하게 만들어야 한다...

    이러한 이유로....멤버함수 뒤에 const 가 붙을 경우에는 리턴되어서도 그 성질을

    유지해야 하므로...리턴타입 앞에도 const로 명시적으로 지정해야 한다..

 

const char& GetName() const   <== 수정불가인 함수이다...

{

   return Ch;

}

 

=> 리턴되는 원본 대상체도 역시,,,수정불가인 특성을 유지하므로...아무런 문제가 없다...

const char& GetName()   <== 아무 문제없는 문장이다...

{

   return Ch;

}

 

=> 이 함수내에서는 멤버변수가 수정 가능하지만...리턴되는 원본대상체를 가지고 수정을 하지 못한다...

그러므로,,,레퍼런스를 리턴시에는 const 멤버함수는 리턴 타입으로도 그 상수성 유지를

위해...const 지정을 하여주도록 한다...

 

댓글 없음:

댓글 쓰기