在 C++ 中创建不可变对象的更好方法

Better way to create immutable object in C++

我想创建一个简单的结构/class,它将代表一些不可变 纯数据。

方式一:

struct Immutable {
    Immutable(int a, int b) : a(a), b(b) {}
    const int a;
    const int b;
};

方式二:

class Immutable {
public:
    Immutable(int a, int b) : a(a), b(b) {}
    int getA() const { return a; }
    int getB() const { return b; }
private:
    int a;
    int b;
};

我能看到的唯一区别是第一种方式更简单,而第二种方式更适合潜在的进一步class扩张。是否还有更多差异(在设计、速度等方面)?

我会选择第二种方法。目前它只是一个 POD,但如果你想添加额外的功能,你需要通过成员函数来完成,然后为了保持一致性,你对数据的访问也是通过方法。例如:

class Immutable {
public:
    Immutable(int a, int b) : a(a), b(b) {}
    int getA() const { return a; }
    int getB() const { return b; }

    int add() const {return a + b}
    int sub() const {return a - b}
private:
    int a;
    int b;
};

您如何获得一致的方法,而不是在某些情况下调用方法并直接访问字段。

此外,通过隐藏成员字段,您可以阻止一些小丑丢弃 const 并修改值。我知道这是未定义的行为,但总有人认为他们会这样做而不是制作不可变对象的副本。让他们很难做到这一点并不是一件坏事。