kyuseo의 게임 프로그래밍

const 함수는 클래스 변수의 포인터(*) 또는 참조(&)를 리턴하면 안된다. 본문

C++ 개발

const 함수는 클래스 변수의 포인터(*) 또는 참조(&)를 리턴하면 안된다.

kyuseo 2008. 1. 8. 19:29

개요..

 

const 함수는 클래스의 변수를 변경하지 않을 경우 사용하는 함수 입니다.

 

또한 클래수 변수의 포인터(*) 또는 참조(&)를 리턴하면 외부에서 그 값을 변경할 수 있기 때문에 그것을 리턴하면 안됩니다.

 

 

결론

 

- 클래스 외부에서 값을 얻는 함수는 const 함수를 사용하지 않는다.

 

- const 함수에서는 포인터(*) 또는 참조(&)를 값을 얻기 위한 인자로 사용하지 않는다.

 

- (const) 포인터(*), 참조(&)를 리턴하는 함수는 const 함수를 사용하지 않는다.

 

 

const 함수의 특성을 잘 보여주는 코드

 

// CArray 와 const 함수의 관계를 잘 보여주는 테스트 클래스

// const 함수에 따라서 CArray의 operator[] 함수의 호출되는 내용이 바뀌므로 매우 주의를 요한다.

class CTest

{

public:

             CTest()

             {

                           CRect rect(0,0,640,480);

                           a.Add( rect );

             }

   

             CRect& GetNormal()

             {

                           return a[0];

             }

   

             CRect& GetConst() const

             {

                           return a[0];

             }

   

             const CRect& GetConst2() const 

             {

                           return a[0];

             }

   

             CRect* GetNormalPtr()

             {

                           return &a[0];

             }

   

             CRect* GetConstPtr() const

             {

                           return &a[0];

             }

   

             CArray< CRect, CRect& > a;      

};

   

 

// 테스트

void test()

{

             CTest t;

   

             // 이값은 정상적인 t.a[0]의 참조형이다.

             CRect& r1 = t.GetNormal();                      

   

             // 이값은 비정상적인 t.a[0]의 임시 복사본의 참조형이다.

             // 따라서 유효하지 않은 쓰레기 값이므로 사용하면 절대 안된다.

             // 그나마 컴파일러차원에서 Waring 가 발생하여 오류를 찾을 수 있다.

             const CRect& r2 = t.GetConst();               

             const CRect& r2_2 = t.GetConst2();          // 역시 문제코드

   

             // 이값은 정상적인 t.a[0]의 포언터이다.

             CRect* p1 = t.GetNormalPtr();

   

             // 이값은 비정상적인 t.a[0]의 임시 복사본의 포인터이다.

             // 따라서 유효하지 않은 쓰레기 값이므로 사용하면 절대 안된다.

             // 컴파일러차원에서 Waring도 발생하지 않아 오류를 찾을 수 없다. (매우주의요망)

             CRect* p2 = t.GetConstPtr();

}