2011-12-30 60 views
3

我對C++比較陌生。我一直在尋找到的Box2D的源代碼,以瞭解人們如何專業地管理他們的代碼,發現這種對頗多:爲什麼做兩個功能? (一個是非常量,另一個是const)

那突然出現在我的腦海裏
inline b2Body* b2World::GetBodyList() 
{ 
    return m_bodyList; 
} 

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

問題是,我們如何知道哪些功能我們叫什麼名字?這種配對的理由是什麼?

回答

4

const版本無法在const b2World上調用;請注意,這些方法的返回類型是不同的。嘗試運行

#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

啊,我明白了。感謝您的簡潔解釋和整潔的例子! – 2011-12-30 13:13:01

+0

對不起,但這個例子不好,誤導,並且與返回類型無關。函數名稱後的'const'運算符表示該代碼不能修改struct的內部結構。也許,編譯器在使用const引用時選擇第二個函數,但結果與在那裏沒有修改相同。擁有這兩個函數根本不會在現實世界中發揮作用 – Ulterior 2011-12-30 14:29:38

+1

@Ulterior:它旨在顯示哪個成員函數將在可變'Foo'上調用,哪個成員函數將在'Foo const&'上調用。 – 2011-12-30 14:32:12

1

兩者兼有的原因是,當你想允許對m_bodyList進行各種訪問時:任何擁有你的類的const實例的人都可以獲得只讀(const)m_bodyList和任何擁有非const實例的人的類可以獲得一個非const的m_bodyList,他們可以修改它。

相關問題