在 C++ 中使用 const 成员变量有优势吗

Are there advantages of using const member variable in C++

我写的代码像

template <typename XAxis, typename YAxis>
class Interpolation {
public:
    using x_value_type = typename XAxis::value_type;
    using y_value_type = typename YAxis::value_type;

    Interpolation(const XAxis& x_axis, const YAxis& y_axis)
        : _x_axis(x_axis), _y_axis(_y_axis)
    {}

public:
    y_value_type interpolate(const x_value_type& x) const;

private:
    const XAxis _x_axis;
    const XAxis _y_axis;
};

当我想要成员变量不可变时。

我有点担心为什么我认为我上面的代码可能由于某种原因被认为是非法或错误代码。
你觉得常量成员变量有没有好处?
请告诉我你的理由。

对我来说似乎没有必要,因为您总是可以使用 const 成员函数来确保您不修改字段。此外,拥有 const 成员变量也会禁用移动语义,这意味着必须始终复制该类型的对象而不能将其移动。我会避免这样做。

const 成员变量确实有一些小的好处。因为编译器知道它们的 const,并且它们的值不能更改,所以编译器可能能够更好地优化引用 const class 成员的任何代码和表达式。

一个更实际的好处是,任何试图修改的逻辑代码错误,这些 class 成员现在将无法编译。否则,逻辑错误可能不会立即显现出来,并导致稍后耗费大量时间来追踪它。

const 成员的一个实际优势是,除非它们属于具有用户定义的默认构造函数的 class,否则必须显式初始化它们。因此,一个符合标准的编译器将捕获任何丢失的初始化。 const 成员表达了预期的功能,即在对象的生命周期内没有变化,这也是一个优势,因此有助于编译器检测任何否则会(错误地)更改值的代码。

另一方面,更重要的是,它们使用默认功能防止复制分配和移动。

这些注意事项也适用于引用数据成员,可以将其视为(概念上)自动解除引用的 const 指针成员。


对于客户端代码,而不是class'自己的代码,逻辑const-ness,不变性,可以用non-public non-[=来表达10=] 具有 const 访问成员函数的数据成员。


¹ 不幸的是,Visual C++ 2015 至少接受一些没有用户定义的默认构造函数的未初始化 const 成员的情况,因此在撰写本文时,不能 100% 确定编译器会捕获丢失的初始化.

常量成员:

  1. 防止复制和移动赋值

  2. 众所周知永远不会改变

  3. 让你的对象真正不可变,有以下优点:

-

  1. 在多线程程序中共享数据时提供性能优势。

  2. 允许编译器非常积极地进行冗余加载优化

You could achieve the same with const accessors to mutable data.

没错,但要维护更多(冗余)代码。