Effective C++ 条款28
2015-06-30 14:48
399 查看
避免返回handles指向对象内部成分
本节作者讲述的知识核心是对于一个类来说,应该避免类返回自己内部的私有数据。如下:
class Point{ public: Point(int x, int y); …… void setX(int newVal); void setY(int newVal); …… }; struct RectData{ Point ulhc;//upper left-hand corner point lrhc;//lower right-hand corner }; class Rectangle{ …… private: std::tr1::shared<RectData> pData; }; class Rectangle{ …… public: Point& upperLeft()const{return pData->ulhc;}//应该尽量避免 Point& lowerRight()const{return pData->lrhc;}//应该尽量避免 };
为什么要避免这种调用呢?很简单,为了避免非法修改被调用的私有数据
如下:
Point coord1(0,0); Point coord1(100,100); const Rectangle rec(coord1,coord2); rec.upperLeft().setX(50);//被非法修改,而且此类行为不易被察觉
有什么解决办法?
解决办法如下:
class Rectangle{ …… public: const Point& upperLeft()const{return pData->ulhc;} const Point& lowerRight()const{return pData->lrhc;} };
上述采用的方式是声明函数返回const对象。
但是,这种方式也不能根治问题,如下:
class GUIObject{……}; const Rectangle boundingBox(const GUIObject& obj); GUIObject* pgo; const Point* pUpperLeft=&(boundingBox(*pgo).upperLeft());
调用boundingBox获得一个新的、临时的Rectangle对象,临时对象没有名字,暂且成为temp,随后upperLeft作用于temp身上,返回一个reference指向temp的一个内部成分。于是,pUpperLeft指向这个Point对象。问题出在temp是一个临时对象,当这个语句结束后,临时对象便会析构,这时pUpperLeft指向一个不再存在的对象。pUpperLeft变成空悬、虚吊(dangling)。
总结:
避免返回handles(reference、指针、迭代器)指向对象内部。遵守这个条款可以增加封装性,帮助const成员函数的行为像个const,并将发生“虚吊号码牌”(dangling handles)的风险降到最低。
相关文章推荐
- C++ typeid操作符
- C语言单项链表的实现
- vs2010 c++ release dump 文件生成
- 求自然对数e的值
- LeetCode_Path Sum II
- 从c++转到python项目碰到的坑--论动态语言的一个小坑
- 欧几里得算法求两个数的最大公约数
- C++ DirectUI库 SoUI
- c++标准头文件的结构
- c++函数指针和多态的关系,与Java的联系
- C++运算符&和&&|和||的不同点
- MFC,C++ 截屏
- C语言WGS84坐标转北京54坐标(高斯投影)及根据两个gps点的趋势确定方向,根据距离,推算一条直线上第三个gps点
- A Tour of C++
- C语言冒泡排序,输入自定义数字
- c++回调函数 callback
- C++笔试题第一波
- c++学习之构造函数
- C++改变编程入口为main函数
- 浅谈C++对象组合