c++ - 在 C++ 中,返回指向非常量对象的指针的 const 方法是否被认为是不好的做法?

标签 c++

在 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 类包含多个方法,这些方法返回指向实用程序类的指针,如 InputManagerAudioManager 等。

class Game
{
public:
    InputManager* inputManager() const { return m_inputManager; }
    ...

private:
    InputManager* m_inputManager;
    ...
}

inputManager() 设为常量是否有意义,因为它返回的对象不是常量? (不应该,因为 InputManager 需要可变才能更新其状态等)

或者我应该删除该方法的 const 修饰符以更准确地反射(reflect)该方法的行为吗?那样的话,如果我有一个 const Game,我就不能调用 inputManager() 然后弄乱 Game 的输入管理器,即使Gameconst

最佳答案

这取决于非 const 指针是否指向 const 对象内部的某些内容,或者它是否是新分配的本来应该是可变的内存。

考虑返回字符串拷贝的东西;即使原始字符串是常量,返回的拷贝也可以是非常量。拷贝的所有权从方法传递给调用代码;确保拷贝被适本地破坏现在是调用代码的问题(很可能是一个非常小的问题)。

但是,从 const 对象内部返回一个指向某些东西的非 const 指针是一个非常糟糕的主意。

关于c++ - 在 C++ 中,返回指向非常量对象的指针的 const 方法是否被认为是不好的做法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3689782/

相关文章:

c++ - boost::program_options "polymorphic"参数

c++ - 转换为基类有效性

c++ - 如何在lambda中捕获函数结果?

c++ - 如何在C++中的Enter处停止接受字符串

c++ - 统一的调用语法和函数指针

c++ - 如何从资源的图像数组中获取一个图像的 HBITMAP?

c++ - 如何在 Visual Studio 中查找特定类的重载运算符的所有引用?

c++ - 为什么 sgi STL 源代码在 operator new 函数前面使用双冒号?

c++ - C++ for循环更新表达式中的赋值表达式

c++ - 检查 C++03 上是否为 const