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

C++: Any reason why function returning pointer shouldn't be const?

本文关键字:常量 任何原 不应该 函数 返回 指针 C++      更新时间:2023-10-16

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

virtual Joint* getJointByID(unsigned int id);
不是

virtual Joint* getJointByID(unsigned int id) const;

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

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

如果没有使用const声明(就像它一样),则不能在const实例上调用该函数,因此保留了const的性质。如果它被声明为const,它最好返回一个const Joint*

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

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

如果你要返回一些对象内部的数据,方法上的const修饰符将不允许其他人能够修改这些内部数据。即使不修改方法内部的对象,也不能简单地将内部对象提供给外部。当你在类的常量实例化上调用这个方法时,这是没有意义的。

你最好的办法是用一个指向常量的指针来保护你的成员数据:

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

返回值的类型与const-correction之间没有关系。

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

我想知道函数返回a是否有任何原因指针不应该是const

没有这样的经验法则。const的有效性取决于你在函数内部做什么。

如果getJointByID函数本身实际上没有改变任何成员在类中,const有什么不存在的理由吗?

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

而且,大多数时候,当派生类打算重写它们的virtual方法时,它们遵循与基类相同的方法模式。现在,如果基类是遗留的,那么不能通过添加const;因此,所有派生类都遵循相同的链。