博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Effective C++ Item 28 避免返回对象内部数据的引用或指针
阅读量:7062 次
发布时间:2019-06-28

本文共 1599 字,大约阅读时间需要 5 分钟。

本文为senlie原创。转载请保留此地址:

Item 31

经验:避免返回handles(包含 references、指针、迭代器)指向对象内部。遵守这个条款可添加封装性。
帮助 const 成员函数的行为像个 const。并将发生“虚吊号码牌”(dangling handles)的可能性降至最低。

演示样例:

class Point{public:	Point(int x, int y);	//...	void setX(int newVal);	void setY(int newVal);	//...};struct RectData{	Point ulhc;	Point urhc;}class Rectangle{public:	//...	Point &upperLeft() const {return pData->ulhc;} // bitwise constness --> const 函数仅仅保证成员变量的值不变。不保证成员变量指针所指的值不变	Point &lowerRight() const {return pData->lrhc;}	//...private:	std::tr1::shared_ptr
pData; // pimpl实现 --> Item 31};Point coord1(0,0);Point coord2(100,100);const Rectangle rec(coord1, coord2);rec.upperLeft().setX(50); // rec 是个const 矩形。从(0,0)到(100,100)。但如今 rec 却变成 从(50,0) 到(100, 100)
解析:返回一个“代表对象内部数据”的handle,随之而来的便是“减少对象封装性”的风险。
不该令成员函数返回一个指针指向“訪问级别较低”的成员函数或成员变量,那样,后者的实际訪问级别就会提高如同前者。
纠正1:在返回类型加上 const
class Rectangle{public:	//...	const Point &upperLeft() const {return pData->ulhc;} 	const Point &lowerRight() const {return pData->lrhc;}	//...};
解析:加了 const 后,尽管客户不能必然它们,但它还是可能导致 dangling handles:这样的handles所指东西不复存在。
演示样例:
class GUIObject (...);const Rectangle boundingBox (const GUIObject &obj); //1.为什么以 by value 方式返回? 自己定义类型不是reference 更好吗? --> 由于 Rectangle 是 GUIObject的内部对象?													//2.既然以by value返回,为什么还要加const,反正返回的是副本,客户改了也没关系呀?GUIObject *pgo;//...const Point *pUpperLeft = &(boundingBox(*pgo).upperLeft()); //这条语句之后 boundingBox返回的对象被析构。间接导致该对象内的Points析构,终于导致 pUpperLeft指向一个不存在的对象
解析:handle比其所指对象更长寿
例外:operator[]会返回strings和vectors的个别元素,这些operator[]就是返回 reference 指向 “容器内的数据”

转载于:https://www.cnblogs.com/yutingliuyl/p/7100595.html

你可能感兴趣的文章
oracle的全局临时表
查看>>
python用sql的limit语句进行分页
查看>>
编译安装ZABBIX客户端(代理)
查看>>
CentOS命令登录MySQL时,报错ERROR 1045 (28000)
查看>>
jsp下拉框中显示数据库信息&&jsp 下拉框从数据库中如何取值?
查看>>
Linux系统编程 --- 共享内存及内存映射【十全十美】
查看>>
如何创建一个swap文件
查看>>
mysql联合索引
查看>>
我的友情链接
查看>>
H5页面快速搭建之高级字体应用实践
查看>>
centos6.5、centos6.6修改ssh默认端口号
查看>>
文本文件和二进制文件
查看>>
轻量级smurf源码
查看>>
linux下桌面环境的介绍及VNC的使用
查看>>
深浅拷贝——string
查看>>
主从复制模式下跳过错误
查看>>
剑指offer17
查看>>
samba文件共享
查看>>
WannaCry勒索软件还在继续传播和感染中
查看>>
TarsGo新版本发布,支持protobuf,zipkin和自定义插件
查看>>