Effective C++ 条款28 避免返回handles指向对象内部成分

1. 所谓的handles指的是引用,指针,迭代器(可能与windows的句柄有所区别),返回一个handles会导致提供给用户对象内部数据的间接访问,这降低了成员变量的封装性,例如:

class Demo{
public:
    ...
    int* getPtr() const {
        return ptr;
    }
private:
    ...
    int* ptr;
}
View Code

这段代码语法正确,但是它违背了将getPtr设为const的初衷:从语法上来说ptr所指对象也属于Demo对象的一部分,但从语法上讲,由于编译器遵循bitwise const,因而const只限制到ptr,而ptr所指对象允许用户更改,因此如果函数返回handles可能会降低对象封装性,并使用户能够间接接触到被封装的内容.

2. 此外,返回handles可能会导致dangling handles(垂悬handles)的存在,因为指针,引用,迭代器提供的是对对象的间接访问,因此实体被销毁而指向它的handles可能仍然存在,此时如果仍然企图通过handles进行对对象(尤其是对于类型转换产生的临时对象而言)的间接访问就有可能导致错误,例如:

class Demo{
public:
    ...
    Demo(int*);
    int* getPtr() const {
        return ptr;
    }
private:
    ...
    int* ptr;
}
View Code

那么以下语句就是及其危险的:

int* tmp=new int;
int* ptr=Demo(tmp).getPtr();  //ptr指向了一个被销毁的临时对象的成员!

 

posted @ 2015-09-01 00:33  Reasno  阅读(220)  评论(0编辑  收藏  举报