c++ - 这是 "mutable"在 C++ 中的一个很好的用例吗?

标签 c++ constants mutable

我有以下类(class):

class MyClass
{
private:
    mutable int* m_buffer;
public:
    MyClass(void)
      : m_buffer(nullptr)
    {
    }
    void init(void)
    {
        m_buffer = new int[10];
    }
    // This is the only public interface to retrieve m_buffer
    const int* evaluate(int param) const
    {
        for(int i = 0; i < 10; ++i)
            m_buffer[i] = param*10;
        return m_buffer;
    }
};

我读到,当类成员的状态不影响类外部状态时,应该使用可变类成员。在上面的代码中,成员m_buffer仅通过evaluate()方法检索。此方法将更改 m_buffer 的值,但新值仅取决于 param 参数。在此特定示例中,使用 mutable 关键字是否正确?

我可以通过以下方式避免使用mutable:

  • 每次调用该函数时都会分配一个新的缓冲区。但是,这会使我的代码变慢,因为缓冲区通常有几 GB。
  • 提前分配输出缓冲区并将其作为参数传递给evaluate函数。但是,这将使我的 API 更难以理解/使用。
  • m_buffer 声明为 int* const。但是,这不起作用,因为由于设计决策,我无法在构造函数的初始值设定项列表中分配 m_buffer

最佳答案

对于您显示的代码,您不需要使用 mutable根本没有关键字。

在 const 成员函数中,this 指针是 const 限定的,那么成员也将是 const,对于 m_buffer 它将是 int* const (注意它不是 const int*),这意味着您仍然可以更改 m_buffer 指向的值,但不能更改其本身。

evaluate() 中,您仅更改 m_buffer 指向的值,而不是 m_buffer 本身,因此应该没问题。

关于c++ - 这是 "mutable"在 C++ 中的一个很好的用例吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36907739/

相关文章:

STL - 在 C++ 中,当键是带字符串的结构时,如何在带有仿函数的映射上使用 find_if?

java - 如何实现一个 java 类,以便它为其他文件中的其他类保存常量

haskell - 在 Haskell 中创建一个可变的 Data.Vector

c# - 什么是 C# 的 "moSTLy complete"(im) 可变性方法?

c++ - 使用未引用的局部变量警告捕获异常

c++ - 使用 Chaiscript 的协程或有状态/可恢复任务

c++ - 同一地址的变量如何产生 2 个不同的值?

C++用变量而不是常量表达式初始化数组

c++ - 实例化变量的新实例