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

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

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 对象时,它只能调用被标记为 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成员与引用返回的注意事项的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1468721.html
微信扫一扫
支付宝扫一扫