首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

effective c++条款28中的有关问题

2012-09-22 
effective c++条款28中的问题我先补全了书上的代码://点类class Point{public:Point(int xVal, int yVal):

effective c++条款28中的问题
我先补全了书上的代码:
//点类
class Point
{
public:

Point(int xVal, int yVal):x(xVal),y(yVal){}
void setX(int newX){ x = newX;}
void setY(int newY){ y = newY;}
private:
int x;
int y;
};

//矩形数据结构
struct RectData
{
RectData(Point p1, Point p2):ulhc(p1),lrhc(p2){}
Point ulhc;//坐上
Point lrhc;//右下
};

//矩形类
class Rectangle
{
public:
Rectangle(RectData data):pData(new RectData(data)){}
Point& upperLeft()const{return pData->ulhc;}
Point& lowerRight()const{return pData->lrhc;}
private:
std::tr1::shared_ptr<RectData> pData;
};

书上第124页下面说:
这立刻带给我们两个教训:第一,成员变量的封装性最多只等于“返回其引用”的函数的访问级别。本例中虽然ulhc和urhc都被声明为private。。。
但是ulhc和urhc都是public吧。c++primer里说过,如果类以struct开头,里面的默认标号就是public;而且,如果不是public,pData->ulhc是不能实现的。
不知道我理解的哪里有问题。

[解决办法]
自己找那个网友翻译版吧。
这直接引出两条教训。第一,一个 data member(数据成员)只能被封装到具有最高可访问级别的函数能返回一个引向它的引用的程度。在当前情况下,虽然 ulhc 和 lrhc 被它们的 Rectangle 认为是 private(私有)的(此处原文有误,根据作者网站勘误修改——译者注),但它们还是被有效地公开了,因为 public 函数 upperLeft 和 lowerRight 返回了引向它们的引用。第二,如果一个 const member function(成员函数)返回一个引用,引向一个与某个 object 有关并存储在这个 object 自身之外的数据,这个函数的调用者就可以改变那个数据(这正是 bitwise constness(二进制位常量性)的局限性(参见 Item 3)的一个副作用)。

热点排行