zoukankan      html  css  js  c++  java
  • 《MORE EFFECTIVE C++》条款27 要求或者禁止对象分配在堆上

    1. 要求对象分配在堆上  

      临时对象一般是存在于栈中的,或者是静态对象存在于常量存储区的。那么当创建一个这样的对象的时候,一般是需要隐式或显式地调用构造函数,在销毁的时候调用析构函数的。可以从这方面入手,去限制构造或析构一个对象,从而达到禁止的效果。很明显,我们可以将构造/析构函数设为private,但是构造函数就没有必要设为private了,一般还得靠它来做一些初始化工作,而析构函数只能有1个,那么将析构函数设为private是最好不过了。如果还是需要用到析构函数呢?只需要设一个public的伪析构函数来调用真的析构函数就可以了(注意析构的时候别用delete了)。

      通过设private的析构函数已经可以要求该类必须在堆上创建对象了。但是该类也不能被作为基类继承了,这可能不是我们要的效果。这也不难解决,把析构函数设为protected不就可以解决了。其他的问题并不大,总是可以解决。

    2. 判断对象是否在堆上

      这个难以实现,即使实现出了,也是不可移植。

    3. 禁止对象分配在堆上

      这个问题好解决,只需要重载operator new操作符,并将其设为private即可。当有人想要用new创建一个对象的时候,就会报错。

      如果想要令继承此类的派生类也不能在堆上分配对象呢?很幸运,只要派生类中没有声明一个public的operator new 成员函数,那么就会继承到基类的private的,从而也会被禁止。如果不巧,派生类中也声明了一个这样的函数呢?抱歉,可能是无解了!

  • 相关阅读:
    php中获取各种路径
    大型网站系统架构演化之路
    404、500、502等HTTP状态码介绍
    Linux 查看进程和删除进程
    mysql中FIND_IN_SET的使用方法
    PHP导出Excel 数字末尾变0或小数点解决办法
    PHP API接口测试小工具
    要慎用mysql的enum字段的原因
    mysql 导入&导出sql文件
    Linux下php安装memcache扩展
  • 原文地址:https://www.cnblogs.com/xcw0754/p/4966471.html
Copyright © 2011-2022 走看看