2011-12-30 1 views
3

저는 C++에 비교적 익숙합니다. 나는 그들의 코드를 관리하고 쌍 이런 종류의 발견 꽤 많은 방법 전문적인 사람들 배울 Box2D의의 소스 코드에보고했다 : 내 마음에 튀어두 가지 기능을 사용해야하는 이유는 무엇입니까? (하나는 const가 아니고 다른 하나는 const 임)

inline b2Body* b2World::GetBodyList() 
{ 
    return m_bodyList; 
} 

inline const b2Body* b2World::GetBodyList() const 
{ 
    return m_bodyList; 
} 

질문은, 어떻게 우리가 어떤 기능을 알고되는 우리 전화 했어? 이런 종류의 쌍에 대한 추론은 무엇입니까?

답변

4

const b2World에서는 const이 아닌 버전을 호출 할 수 없습니다. 메서드의 반환 형식이 다르다는 점에 유의하십시오.

#include <iostream> 

struct Foo 
{ 
    void greet() { std::cout << "Hello, world!\n"; } 
    void greet() const { std::cout << "Hello, const world!\n"; } 
}; 

int main() 
{ 
    Foo foo; 
    foo.greet(); 

    Foo const &fooref(foo); 
    fooref.greet(); 
} 

또한 C++ FAQ Lite on const-correctness를 참조 실행 해보십시오.

+0

아하겠습니다. 간결한 설명과 깔끔한 ​​예제 주셔서 감사합니다! –

+0

죄송합니다.하지만이 예제는 잘못되어 돌아가며 반환 유형과는 관련이 없습니다. 함수 이름 뒤에'const' 연산자는 코드가 구조체의 내부를 수정할 수 없다는 것을 나타냅니다. 어쩌면 컴파일러는 const 참조로 작업 할 때 두 번째 함수를 선택하지만 그 결과는 아무런 수정이없는 것과 같습니다. 이 2 가지 함수를 가지는 것은 현실 세계에서 전혀 의미가 없습니다. – Ulterior

+1

@Ulterior : 변경 가능한'Foo'에서 호출 될 멤버 함수와'Foo const &'에서 어떤 멤버 함수가 호출되는지를 보여줍니다. –

1

두 가지 이유는 m_bodyList에 대한 종류의 액세스를 허용하려는 경우입니다. 클래스의 const 인스턴스가있는 사용자는 읽기 전용 (const) m_bodyList 및 비 const 인스턴스 클래스의 non-const m_bodyList를 얻을 수 있습니다.

관련 문제