Post Lists

2018년 7월 22일 일요일

const function in c++

https://stackoverflow.com/questions/3141087/what-is-meant-with-const-at-end-of-function-declaration

여기에 좋은 답변이 있어서 그것을 번역

한 함수의 선언뒤에 const keyword가 표시되는 "const function"은 이 클래스 함수가 클래스의 멤버 변수를 바꾸려고 하는 것을 컴파일 에러가 뜨게 한다. 그러나, 한 클래스의 변수들을 읽어오는 것은 함수의 내부에서 괜찮지만, 이 함수의 내부에서 쓰는 것(writing)은 컴파일 에러를 발생시킬 것이다.

그러한 "const function"에 대해 생각할 수 있는 또 다른 방법은 한 클래스 함수를 implicit this pointer를 취한 일반적인 함수로서 보는 것이다. 그래서 한 method int Foo::Bar(int random_arg) (끝에 const가 없는) 는 int Foo_Bar(Foo* this, int random_arg)와 같은 함수를 만들어 낼 것이고, Foo f; f.Bar(4)와 같은 호출은 내부적으로 Foo f; Foo_Bar(&f, 4)와 같은 어떤 것과 일치할 것이다. 이제 끝에 const를 더하는 것은 (int Foo::Bar(int random_arg) const)는 const this pointer가 있는 선언으로 이해되어질 수 있다: int Foo_Bar(const Foo* this, int random_arg).  그러한 경우에 this의 타입이 const이기 때문에, 멤버 변수에 대한 어떠한 수정도 가능하지 않다.

그 함수가 한 클래스의 어떤 변수에 대해 write를 하지 못하도록 하는 "const function" 제한을 느슨하게 하는 것도 가능하다. 심지어 함수가 "const function"으로서 표시되어졌을 때 몇 몇 변수들이 writable되도로 ㄱ하기 위해서, 이러한 변수들은 keyword mutable로 표시되어야 한다. 따라서, 만약 한 함수 변수가 mutable로 마크된다면, const function은 이 변수에 대해 writes하고,  그러고나서 그 코드는 깔끔히 컴파일 되고, 그 변수가 변하는 것이 가능하다. (C++ 11)

const keyword를 다룰 때 보통, C++ 선언에서 const keyword의 위치를 바꾸는 것은 전적으로 다른 의미이다. const의 위의 사용은 함수 선언의 괄호 후 끝에 const를 더할 때에만 적용된다. const는 매우 C++에서 과도하게 사용되는 qualifier(수식어)이다. 그리고 그 syntax와 순서는 종종 포인터와 결합할 때 간단하지 않다. const 올바름과 const keyword에 대한 몇가지 읽을 것들이 있다.

댓글 없음:

댓글 쓰기