kyuseo의 게임 프로그래밍
const 함수는 클래스 변수의 포인터(*) 또는 참조(&)를 리턴하면 안된다. 본문
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(); } |