zoukankan      html  css  js  c++  java
  • 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指向了一个被销毁的临时对象的成员!
  • 相关阅读:
    网络兼职轻松赚
    微信H5支付demo
    支付宝H5支付demo
    笔记本安装SSD固态硬盘详细的优化设置
    JQuery的AJAX
    第二次面试
    存储过程的总结
    SQl数据操作和查询
    面对考试毫无畏惧的SSH
    掷骰子-IOS新手项目练习(抱歉,由于个人原因,图片没显示,要源码的项目私聊)
  • 原文地址:https://www.cnblogs.com/reasno/p/4774703.html
Copyright © 2011-2022 走看看