设计不可变对象需注意:1. const成员变量必须在构造函数初始化列表中赋值,确保初始化后不被修改;2. 避免返回非const引用,防止外部修改内部状态;3. 所有访问方法标记为const函数,以支持const对象调用;4. 初始化列表中完成const成员赋值,勿在构造函数体内赋值;例如point类通过const成员实现坐标不可变性,data类应将getref返回const引用避免状态被篡改,immutable类通过const成员函数保证const对象可调用获取状态的方法。

在C++中设计不可变对象时,const成员和引用返回的使用是两个关键点。它们不仅能帮助我们实现对象状态的不可变性,还能避免一些潜在的错误。但如果不小心使用,也容易引发问题。

在类中声明为 const 的成员变量必须在构造函数的初始化列表中赋值,之后就不能再改变。这对于设计不可变对象非常有用,比如一个表示坐标点的类:

class Point {
public:
Point(int x, int y) : x_(x), y_(y) {}
int getX() const { return x_; }
int getY() const { return y_; }
private:
const int x_;
const int y_;
};这样一旦创建了 Point 对象,它的 x_ 和 y_ 就不能被修改,从而实现了不可变性。
立即学习“C++免费学习笔记(深入)”;
注意事项:

const 成员;即使你的对象是“不可变”的,如果某个方法返回了内部成员的引用,就可能破坏这种不可变性。例如:
class Data {
public:
Data(int value) : value_(value) {}
int& getRef() { return value_; }
private:
int value_;
};看起来这个类很简单,但如果有人这样使用:
Data d(10); int& ref = d.getRef(); ref = 20; // 修改了d的内部状态!
这就违背了不可变的设计初衷。
建议做法:
返回内部状态时尽量使用值拷贝;
如果一定要返回引用,记得加上 const:
const int& getRef() const { return value_; }这样用户只能读取,不能修改。
当你有一个 const 对象时,它只能调用被标记为 const 的成员函数。所以如果你希望对象在创建后完全不可变,所有获取状态的方法都应加 const 后缀:
class Immutable {
public:
Immutable(int val) : val_(val) {}
int getValue() const { return val_; } // 正确的做法
private:
const int val_;
};否则下面这段代码就会出错:
const Immutable obj(5); obj.getValue(); // 如果getValue不是const函数,这里会报错
设计不可变对象时要注意几个细节:
const 成员变量来禁止后续修改;const 的引用,防止外部篡改;const 函数;const 成员的赋值。基本上就这些,不复杂但容易忽略。
以上就是C++中如何设计不可变对象 const成员与引用返回的注意事项的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号