在 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
并修改值。我知道这是未定义的行为,但总有人认为他们会这样做而不是制作不可变对象的副本。让他们很难做到这一点并不是一件坏事。
我想创建一个简单的结构/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
并修改值。我知道这是未定义的行为,但总有人认为他们会这样做而不是制作不可变对象的副本。让他们很难做到这一点并不是一件坏事。