标签:容器 shared pac box 迭代器 ora track ati 号码
本文为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)
class Rectangle{ public: //... const Point &upperLeft() const {return pData->ulhc;} const Point &lowerRight() const {return pData->lrhc;} //... };
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指向一个不存在的对象
Effective C++ Item 28 避免返回对象内部数据的引用或指针
标签:容器 shared pac box 迭代器 ora track ati 号码
原文地址:http://www.cnblogs.com/yutingliuyl/p/7100595.html