C++箴言:避免返回对象内部构件的句柄[VC/C++编程]
本文“C++箴言:避免返回对象内部构件的句柄[VC/C++编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
假定你正在一个包含矩形的利用程序上工作.每一个矩形都可以用它的左上角和右下角表示出来.为了将一个 Rectangle 对象保持在较小状况,你大概决意那些点的定义的域不该该包含在 Rectangle 本身之中,更符合的做法是放在一个由 Rectangle 指向的帮助的构造体中:
class Point {
// class for representing points
public:
Point(int x, int y);
...
void setX(int newVal);
void setY(int newVal);
...
};
struct RectData {
// Point data for a Rectangle
Point ulhc; // ulhc = " upper left-hand corner"
Point lrhc; // lrhc = " lower right-hand corner"
};
class Rectangle {
...
private:
std::tr1::shared_ptr pData; // see Item 13 for info on
}; // tr1::shared_ptr
由于 Rectangle 的客户需求有本领操控 Rectangle 的区域,因此类供应了 upperLeft 和 lowerRight 函数.但是,Point 是一个用户定义范例,所以,在典型情形下,以传引用的方法传送用户定义范例比传值的方法越发高效的概念,这些函数返回引向底层 Point 对象的引用:
class Rectangle {
public:
...
Point& upperLeft() const { return pData->ulhc; }
Point& lowerRight() const { return pData->lrhc; }
...
};
这个计划可以编译,但它是错误的.实际上,它是自相冲突的.一方面,upperLeft 和 lowerRight 是被声明为 const 的成员函数,因为它们被计划成仅仅给客户供应一个得到 Rectangle 的点的办法,而不答应客户改变这个 Rectangle.另一方面,两个函数都返回引向私有的内部数据的引用——调用者可以操纵这些引用改正内部数据!比方: Point coord1(0, 0);
Point coord2(100, 100);
const Rectangle rec(coord1, coord2); // rec is a const rectangle from
// (0, 0) to (100, 100)
rec.upperLeft().setX(50); // now rec goes from
// (50, 0) to (100, 100)!
>
请注意这里,upperLeft 的调用者是怎样操纵返回的 rec 的内部 Point 数据成员的引用来改变这个成员的.但是 rec 却被盼望为 const!
这直接引出两条经验.第一,一个数据成员被封装,但是具有最高可拜候级别的函数还是可以返回引向它的引用.在当前情形下,固然 ulhc 和 lrhc 被声明为 private,它们还是被有效地公开了,因为 public 函数 upperLeft 和 lowerRight 返回了引向它们的引用.第二,假如一个 const 成员函数返回一个引用,引向一个与某个对象有关并存储在这个对象本身之外的数据,这个函数的调用者便可以改变那个数据(这恰是二进制位常量性的范围性的一个副作用).
以上是“C++箴言:避免返回对象内部构件的句柄[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |