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指向了一个被销毁的临时对象的成员!
  • 相关阅读:
    在ASP.Net和IIS中删除不必要的HTTP响应头
    Json对象与Json字符串互转
    Jquery ajax传递复杂参数给WebService
    HTTP的KeepAlive是开启还是关闭?
    MQ产品比较-ActiveMQ-RocketMQ
    RocketMQ(7)——通信协议
    mq使用经验
    mq
    RocketMQ
    发送短信验证码实现方案
  • 原文地址:https://www.cnblogs.com/reasno/p/4774703.html
Copyright © 2011-2022 走看看