C++:函数返回指针不应该是常量的任何原因?
C++: Any reason why function returning pointer shouldn't be const?
我想知道是否有任何理由一个返回指针的函数不应该是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
;因此,所有派生类都遵循相同的链。
- #定义c-预处理器常量..我做错了什么
- 用C++中的一个变量定义一个常量
- 什么时候在C++中返回常量引用是个好主意
- 在C++的头文件中使用常量并在程序中询问其地址的任何潜在危险
- c++ 编译器是否保护常量内存地址免受任何更改?
- C++中是否有任何常量可以用作比较中的最小值/最大值
- 当通过常量和不是字符串的最佳选择时,是否有任何情况?
- 常量字符*是否有任何例外?
- std::unordered_set 是否对任何对象进行摊销常量查找时间,而不考虑谓词
- 为什么双转换到看似任何原始的常量参考
- 如何使用编译时常量原语的类型
- 重载运算符:常量与非常量返回类型:任何性能差异
- 如何在任何文件中包含带有cuda常量的头文件
- 不分配任何字符内存的常量字符串构造函数?
- 提升::任何构造函数 - 常量类型重载分辨率
- 在constexpr中使用argc,是否严格要求所涉及的任何子表达式都是常量表达式
- 临时绑定到常量引用的特定形式没有任何效果
- C++:函数返回指针不应该是常量的任何原因?
- 对于c++中大量的私有类常量声明,任何不从另一个文件#include的理由
- 视觉 任何非(字符*)正确的方法,用于从 C++ 中的常量字符串初始化 void*