멤버함수에서의 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 지정을 하여주도록 한다...
댓글 없음:
댓글 쓰기