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

本文共 1544 字,大约阅读时间需要 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 指向 “容器内的数据”
你可能感兴趣的文章
Mellanox公司计划利用系统芯片提升存储产品速度
查看>>
白帽子守护网络安全,高薪酬成大学生就业首选!
查看>>
ARM想将芯片装进人类大脑 降低能耗是一大挑战
查看>>
Oracle数据库的备份方法
查看>>
Selenium 自动登录考勤系统
查看>>
关于如何以编程的方式执行TestNG
查看>>
智能照明造福千家万户 家居智能不再是梦
查看>>
物联网如何跳出“看起来很美”?
查看>>
浅谈MySQL 数据库性能优化
查看>>
《UNIX/Linux 系统管理技术手册(第四版)》——1.10 其他的权威文档
查看>>
灵动空间 创享生活
查看>>
《UNIX网络编程 卷1:套接字联网API(第3版)》——8.6 UDP回射客户程序:dg_cli函数...
查看>>
不要将时间浪费到编写完美代码上
查看>>
《第一桶金怎么赚——淘宝开店创业致富一册通》一一第1章 创业梦想,怎样起步...
查看>>
基于容器服务的持续集成与云端交付(三)- 从零搭建持续交付系统
查看>>
《算法基础:打开算法之门》一3.4 归并排序
查看>>
高德开放平台开放源代码 鼓励开发者创新
查看>>
《高并发Oracle数据库系统的架构与设计》一2.5 索引维护
查看>>
《Exchange Server 2010 SP1/SP2管理实践》——2.4 部署外部网络环境
查看>>
Firefox 是 Pwn2own 2014 上攻陷次数最多的浏览器
查看>>