我有以下类(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/