在 C++ 中,返回指向非 const 对象的指针的 const 方法是否被视为不良做法?例如。考虑以下方法:
// Makes perfect sense
bool isActive() const { return m_isActive; }
// Makes perfect sense, both consts ensure nothing is modified
const SomeObject* someObject() const { return m_someObject; }
// Makes perfect sense, no const because SomeObject is mutable,
// thus MyClass is indirectly mutable
SomeObject* someObject() { return m_someObject; }
// Makes no sense, if you're just returning a pointer to a const object,
// then the method should clearly be const since nothing can be modified
const SomeObject* someObject() { return m_someObject; }
最后一个组合让我感到困惑:以下是否被视为不良做法?
SomeObject* someObject() const { return m_someObject; }
因为方法返回的类不是 const,但方法是,这有点毫无意义,因为您可以修改 SomeObject
从而间接修改您的类...那么这种形式被认为是不好的做法吗?例如您应该只使用以下其中一项来代替它吗?
const SomeObject* someObject() const { return m_someObject; }
SomeObject* someObject() { return m_someObject; }
现实世界的情况:我正在编写一个智能手机游戏,它有一个 Game
类。 Game
类包含多个方法,这些方法返回指向实用程序类的指针,如 InputManager
、AudioManager
等。
class Game
{
public:
InputManager* inputManager() const { return m_inputManager; }
...
private:
InputManager* m_inputManager;
...
}
将 inputManager()
设为常量是否有意义,因为它返回的对象不是常量? (不应该,因为 InputManager
需要可变才能更新其状态等)
或者我应该删除该方法的 const
修饰符以更准确地反射(reflect)该方法的行为吗?那样的话,如果我有一个 const Game
,我就不能调用 inputManager()
然后弄乱 Game
的输入管理器,即使Game
是 const
。
最佳答案
这取决于非 const 指针是否指向 const 对象内部的某些内容,或者它是否是新分配的本来应该是可变的内存。
考虑返回字符串拷贝的东西;即使原始字符串是常量,返回的拷贝也可以是非常量。拷贝的所有权从方法传递给调用代码;确保拷贝被适本地破坏现在是调用代码的问题(很可能是一个非常小的问题)。
但是,从 const 对象内部返回一个指向某些东西的非 const 指针是一个非常糟糕的主意。
关于c++ - 在 C++ 中,返回指向非常量对象的指针的 const 方法是否被认为是不好的做法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3689782/