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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值