• 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指向了一个被销毁的临时对象的成员!
  • 相关阅读:
    表中表效果
    有关div的位置,隐藏显示和移动
    js 获取服务器控件的值
    JavaScript resizeBy()
    js弹出对话框
    js操作select控件的几种方法发布
    javascript
    POJ2135(最小费用最大流模板)
    吐槽(2012/5/21)
    POJ2391(网络流)
  • 原文地址:https://www.cnblogs.com/reasno/p/4774703.html
Copyright © 2020-2023  润新知