C ++:函数返回指针不应该是const的任何原因?

时间:2011-07-19 09:22:46

标签: c++

我想知道返回指针的函数是否应该是const是否有任何原因。我正在研究一些在大多数地方似乎是const-correct的代码,但由于某种原因,并没有声明函数将指针返回为const。例如,它写

virtual Joint* getJointByID(unsigned int id);

而不是

virtual Joint* getJointByID(unsigned int id) const;

如果getJointByID函数本身实际上没有改变该类的任何成员,那么const是否应该存在?

4 个答案:

答案 0 :(得分:7)

这实际上是有道理的。如果要使用const声明函数,则意味着它可以在常量实例(constvar.getJointByID ...)上使用。但是如果它返回一个指向内部结构的指针然后可以被修改,它将允许用户绕过实例的const限制。

如果未使用const声明(就像它),则无法在const实例上调用该函数,因此保留了常量。如果已声明const,则最好返回const Joint*

(我在这里假设Joint *确实是类数据结构的一部分。如果类返回一个新分配的Joint左右的副本,那么它就不会是常量。取决于实施)

答案 1 :(得分:1)

  

我想知道函数返回的原因是否有任何原因   指针不应该是常量。

没有这样的经验法则。 const取决于你在函数中做了什么。

  

如果getJointByID函数本身实际上没有更改任何成员   这个类,有没有任何理由const不应该在那里?

你在这里是对的。该函数应该是const作为良好编程实践的一部分。但这不是强制性的。

此外,大多数情况下,派生类在打算覆盖其virtual方法时遵循相同的基类方法模式。现在,如果基类是遗留的,那么就不能通过放置const来改变它的语法。因此所有派生类都遵循相同的链。

答案 2 :(得分:1)

Const正确性不仅取决于返回类型;从方法中返回的内容也很重要。

如果要返回对象内部的一些数据,则方法上的const修饰符将不允许其他人修改此内部数据。即使您不修改方法内的对象,也不能简单地使用变异权限向内部世界提供内部服务。当您在类的常量实例化上调用此方法时,这没有意义。

最好的办法是通过指向常量的指针来保护成员数据:

virtual const Joint* getJointByID(unsigned int id) const;

答案 3 :(得分:1)

返回值的类型与常量修正之间没有关系。

如果您返回的指针位于作为对象一部分的结构中,那么您应该返回指向const的指针,或者不将该函数声明为const因为你可以通过那个指针改变对象。