我想知道返回指针的函数是否应该是const是否有任何原因。我正在研究一些在大多数地方似乎是const-correct的代码,但由于某种原因,并没有声明函数将指针返回为const。例如,它写
virtual Joint* getJointByID(unsigned int id);
而不是
virtual Joint* getJointByID(unsigned int id) const;
如果getJointByID函数本身实际上没有改变该类的任何成员,那么const是否应该存在?
答案 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
因为你可以通过那个指针改变对象。