Effective C++ Item 28 避免返回对象内部数据的引用或指针
来源:互联网 发布:梦幻藏宝阁估号软件 编辑:程序博客网 时间:2024/06/07 20:19
本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie
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<RectData> 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 指向 “容器内的数据”
0 0
- Effective C++ Item 28 避免返回对象内部数据的引用或指针
- 《Effective C#》Item 22:避免返回类内部成员的引用
- Effective c++之Item 28: 避免返回对象内部构件的“句柄”
- Effective c++ Item 28 不要返回指向对象内部数据(internals)的句柄(handles)
- Effective c++ Item 28 不要返回指向对象内部数据(internals)的句柄(handles)
- Effective c++ Item 28 不要返回指向对象内部数据(internals)的句柄(handles)
- [翻译] Effective C++, 3rd Edition, Item 28: 避免返回 object 内部构件的 "handles"(“句柄”)
- Effective C++——必须返回对象时,别妄想返回其引用或指针
- 《Effective C++》学习笔记条款28 避免返回handls指向对象内部成分
- Effective C++:条款28:避免返回 handles 指向对象内部成员
- 读书笔记《Effective C++》条款28:避免返回handles指向对象内部成分
- C++之避免返回handles指向对象内部成分(28)---《Effective C++》
- effective c++ ------不要返回指向局部对象指针或引用,该返回对象就返回对象.
- Effective C# Item23:避免返回内部类对象的引用
- Item 28:不要返回对象内部的句柄 Effective C++笔记
- 《more effective c++》Item M1:指针与引用的区别
- 《More Effective C++》 Item M1:指针与引用的区别
- Effective C++ 第二版 29)内部句柄 30)成员函数返回非const指针或引用
- MyEclipse快捷键大全
- IOS编程 之 传值
- 存储位置 内部存储 外部存储 SharePreference
- 获取属性配置config文件
- Apache Spark探秘:利用Intellij IDEA构建开发环境
- Effective C++ Item 28 避免返回对象内部数据的引用或指针
- 【转】 java中的字符串分割函数
- WebLogic10 安装
- JSP内置对象—session
- Ubuntu下解压tar软件包的方法
- Windows下 maven3.0.4的安装步骤+maven配置本地仓库
- net.sf.json.JSONException: java.lang.reflect.InvocationTargetException & java.lang.NullPointerExcept
- jquery 页面加载事件
- spark定制之五:使用说明