Game Develop

[C++] const객체는 마음대로 멤버함수를 호출할 수 없다. 본문

C++/C++

[C++] const객체는 마음대로 멤버함수를 호출할 수 없다.

MaxLevel 2022. 11. 29. 04:17

 

 

main함수에서의 Test클래스의 GetName함수는 에러가 안나는데, foo함수에서의 GetName은 위와같은 에러가 뜬다.

 

그 이유는 main함수에서의 t라는 Test객체는 const 객체가 아니고, foo함수에서의 레퍼런스로 받은 t는 const 객체이기 때문이다.

 

const객체는 내부 값의 변경이 불가능하다. 그렇기 때문에 해당 객체가 하는 모든행위는 기본적으로 객체의 값이 변경이 되지 않는다는 '보장'을 받아야 한다.

 

그 보장을 받기위한 방법 중 하나가, 멤버함수의 선언 끝에 const키워드를 붙이는 것이다.

 

멤버함수의 뒤에 const키워드가 붙는다면, 해당 멤버함수내에서는 멤버변수에 값을 write하는 행위는 할 수 없다.

 

그렇기 때문에 foo함수에서의 GetName은 위와 같은 에러를 뱉는 것이다. 코드를 보면 GetName에 const키워드가 붙어 있지 않았다. 

 

만약 붙인다면,

 

잘 실행된다.

 

좀 더 내부적으로 파헤치자면, 원래 클래스인스턴스에서 멤버함수를 호출할 때는, 해당 멤버함수에 암시적으로 this포인터를 전달함으로써 멤버함수를 수행하게된다.

( 클래스의 멤버함수들은 멤버변수마냥 인스턴스마다 독자적인 공간을 할당받는게 아닌, 클래스가 정의될 때 코드세그먼트에 정의된다. 클래스의 멤버함수는 해당 클래스의 인스턴스라면 어디서 호출하던 같은 기능을 수행하기 때문에, 굳이 독자적으로 공간을 할당해서 메모리를 낭비할 필요가 없다. 

다만 어디서 호출하는지 알아야하기 때문에 인스턴스에서 멤버함수를 호출할 때 자기자신의 포인터인 this포인터를 전달한다.)

 

근데 const 객체의 경우, const this 포인터를 전달한다고 한다. 이 const this는 const 멤버함수만 호출할 수 있고, const 함수가 아닌 함수를 호출하려 할 경우

 'std::string Test::GetName(void)': 'this' 포인터를 'const Test'에서 'Test &'(으)로 변환할 수 없습니다.

 

라고 오류가 뜬다. 

이러다보니까 똑같은 함수에 const 여부만으로도 오버로딩이 적용된다.