2008-10-30 5 views
51

C++에서 함수의 서명은 부분적으로 const인지 여부에 달려 있습니다. 즉, 하나의 클래스는 const이고 다른 하나는 그렇지 않다는 것을 제외하고 클래스는 동일한 서명을 가진 두 개의 멤버 함수를 가질 수 있습니다. 이와 같은 클래스가 있으면 컴파일러는 호출하는 객체에 따라 호출 할 함수를 결정합니다. 클래스의 const 인스턴스 인 경우 함수의 const 버전이 호출됩니다. 객체가 const가 아닌 경우 다른 버전이 호출됩니다.C++에서 const 오버로드를 사용하는 것은 무엇입니까?

어떤 경우에이 기능을 활용하고 싶습니까?

답변

24

이것은 실제로 멤버 함수가 클래스의 데이터 멤버 (또는 멤버의 멤버 또는 멤버의 멤버의 멤버 등)에 대한 포인터 또는 참조를 반환 할 때만 의미가 있습니다. . 일반적으로 비 const 포인터 나 데이터 멤버에 대한 참조를 반환하는 경우도 있지만 때로는 합리적이거나 간단합니다 (예 : [] 연산자). 이 경우 getter의 const 및 non-const 버전을 제공합니다. 이 방법은 객체를 수정할 수 있는지 여부를 결정하는 데 사용되며, const 또는 non-const로 선언 할 수 있습니다.

23

컴파일러가 const 객체 또는 일반 객체를 반환할지 여부를 결정하고 동일한 메소드 서명을 유지하도록 컴파일러를 설정할 수 있습니다. Const Correctness에 대한 자세한 설명이 있습니다.

4

개체에 대한 const 참조를 반환할지 여부를 결정할 때 사용할 수 있습니다. STL의 컨테이너는 const_iterator 또는 일반 iterator를 반환할지 여부를 결정하기 위해 const 오버로드 된 begin() 및 end() 함수를 사용합니다.

4

std :: map :: operator []의 동작을 살펴보십시오. 잘못된 버전을 참조하려고하지만 const가 아닌 버전이 삽입을 수행하면 const 버전에서 오류가 발생합니다. 삽입 동작은 std :: map :: insert를 사용하는 것보다 훨씬 편리하지만 const 맵에서는 작동하지 않습니다.