首先看看下面这个例子:

 class Point{
public:
point(int x, int y);
...
void setX(int newVal);
void setY(int newVal);
...
};
struct RectData{
Point ulhc; //左上角
Point lrhc; //右下角
};
class Rectangle{
...
private:
shared_ptr<RectData> pData;
};

那么如果出现下面这种成员函数的话:

 class Rectangle{
public:
...
Point & upperLeft() const {return pData->ulhc; }
Point & lowerRight() const{return pData->lrhc; }
...
}
这样只是能通过编译,但是设计确是错误的,在成员函数被声明为const的情况下返回了一个内部成员的引用,这样使得ulhc 以及 lrhc对象都可以被更改。但是二者都是private的,实际上二者都是不应该被改变的。
这正是由于返回的是引用,同样的返回指针,迭代其这种叫做handle的对象都是会造成内部状态暴露在外面。
这些问题实际上在每个方法的返回的handle上加上const就会得到解决。
 class Rectangle{
public:
...
const Point & upperLeft() const {return pData->ulhc; }
const Point & lowerRight() const{return pData->lrhc; }
...
}

但是几十这样做仍然可能会导致造成虚调handle的现象发生:

class GUIobject{...};
const Rectangle
boundingBox(const GUIobject & obj);
//那么,当用户这样去使用他的时候
GUIobject * pgo;
...
const Point * pUpperLeft =
&(boundingBox(*pgo).pUpperLeft());
这样实际上将Rectancle中的Point对象传递出去了,这样当临时对象析构的时候,这个指针就会编程一个空悬的指针(感觉通过智能指针就能解决啊),这样也带来了风险。
 
小结:
避免返回Handle指向内部对象,这样可以增加封装性,帮助const函数的行为像是一个const,并将空悬Handle的可能性降到最低。

最新文章

  1. [翻译] ORMLite document -- How to Use Part (一)
  2. mysql日志详细解析
  3. P问题、NP问题和NPC问题
  4. poj1981Circle and Points(单位圆覆盖最多的点)
  5. 基于PinnedSectionListView实现联系人通讯录并且点击打电话
  6. [转]宏的高级使用--##,__VA_ARGS__, __FILE__, __FUNCTION__等
  7. 解决hexo神烦的DTraceProviderBindings MODULE_NOT_FOUND
  8. Rythm.js 使用教程详解
  9. Gradle 1.12用户指南翻译——第五十三章. 签名插件
  10. 树链剖分——边权poj2763
  11. 阿里云IoT
  12. OrCAD Capture CIS 16.6 在原理图页面内放置图片
  13. 关于连接oracle工具plsql的一些使用
  14. 《RabbitMQ Tutorial》译文 第 1 章 简介
  15. mac gcc develop
  16. acl 4 year statistics
  17. JMH 使用指南 - java 性能测试
  18. Mysql 关闭自动commit
  19. js的栈与堆
  20. mysql数据库从删库到跑路之select单表查询

热门文章

  1. (4.7)sql server2008 中的merge
  2. php采集
  3. pycharm修改配置
  4. Django:学习笔记(2)——创建第一个应用
  5. 安装三大浏览器驱动driver
  6. tesseract 3.05 release 编译
  7. qt项目: error LNK2038: 检测到“_MSC_VER”的不匹配项: 值“1900”不匹配值“1800”
  8. 20145201 《Java程序设计》第一周学习总结(修改)
  9. Gradle命令详解与导入第三方包--快速打包
  10. Spring AOP(3)