当前位置:七道奇文章资讯编程技术VC/C++编程
日期:2011-03-22 13:55:00  来源:本站整理

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好友分享!
  • 好的评价 如果您觉得此文章好,就请您
      0%(0)
  • 差的评价 如果您觉得此文章差,就请您
      0%(0)

文章评论评论内容只代表网友观点,与本站立场无关!

   评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .