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

时间:2018-03-17 12:32:41

标签: c++ class struct const immutability

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

方式1:

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

方式2:

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;
};

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

1 个答案:

答案 0 :(得分:3)

我采用第二种方法。目前它只是一个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丢弃并修改该值。我知道这是未定义的行为,但总会有人认为他们会这样做,而不是制作不可变对象的副本。让他们难以做到这一点并不是件坏事。