• Effective C++ Item 28 避免返回对象内部数据的引用或指针


    本文为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 指向 “容器内的数据”

  • 相关阅读:
    bzoj千题计划202:bzoj3191: [JLOI2013]卡牌游戏
    bzoj千题计划201:bzoj1820: [JSOI2010]Express Service 快递服务
    bzoj千题计划200:bzoj3106: [cqoi2013]棋盘游戏
    bzoj千题计划199:bzoj1055: [HAOI2008]玩具取名
    NOIP2017 小凯的疑惑
    Codeforces 837E. Vasya's Function
    bzoj1084: [SCOI2005]最大子矩阵
    bzoj4247: 挂饰
    Codeforces Round #276 (Div. 1) A. Bits
    bzoj千题计划196:bzoj4826: [Hnoi2017]影魔
  • 原文地址:https://www.cnblogs.com/yutingliuyl/p/7100595.html
Copyright © 2020-2023  润新知