2011-12-30 43 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,他们可以修改它。

相关问题