我想创建一个简单的结构/类,它将代表一些不可变的普通数据。
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;
};
我能看到的唯一区别是第一种方式更简单,第二种方式更适合潜在的进一步扩展。是否有任何差异(在设计,速度等方面)?
答案 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
丢弃并修改该值。我知道这是未定义的行为,但总会有人认为他们会这样做,而不是制作不可变对象的副本。让他们难以做到这一点并不是件坏事。