zoukankan      html  css  js  c++  java
  • 条款九: 避免隐藏标准形式的new

    因为内部范围声明的名称会隐藏掉外部范围的相同的名称,所以对于分别在类的内部和全局声明的两个相同名字的函数f来说,类的成员函数会隐藏掉全局函数

    class x {
    public:
      void f();
    
      // operator new的参数指定一个
      // new-hander(new的出错处理)函数
      static void * operator new(size_t size, new_handler p);
    };
    
    void specialerrorhandler();          // 定义在别的地方
    
    x *px1 =
      new (specialerrorhandler) x;       // 调用x::operator new
    
    x *px2 = new x;                      // 错误!

    在类里定义了一个称为“operator new”的函数后,会不经意地阻止了对标准new的访问。解决办法是在类里写一个支持标准new调用方式的operator new,它和标准new做同样

    的事。这可以用一个高效的内联函数来封装实现。

    class x {
    public:
      void f();
    
      static void * operator new(size_t size, new_handler p);
    
      static void * operator new(size_t size)
      { return ::operator new(size); }
    };
    
    x *px1 =
      new (specialerrorhandler) x;      // 调用 x::operator
                                        // new(size_t, new_handler)
    
    x* px2 = new x;                     // 调用 x::operator
                                        // new(size_t)

    另一种方法是为每一个增加到operator new的参数提供缺省值(见条款24):

    class x {
    public:
      void f();
    
      static
        void * operator new(size_t size,                // p缺省值为0
                            new_handler p = 0);         // 
    };
    
    x *px1 = new (specialerrorhandler) x;               // 正确
    
    x* px2 = new x;                                     // 也正确
  • 相关阅读:
    理解和学习qml
    (离线)英语词典软件推荐
    Ubuntu:安装deb文件包以及deb卸载
    mac man汉化方法
    Linux中文件和目录的权限(r, w, x)
    解决mac休眠掉电的解决方法
    线程池之ThreadPool与ForkJoinPool
    程序员的知识焦虑
    回顾2018,展望2019
    NIO基础学习——缓冲区
  • 原文地址:https://www.cnblogs.com/ljygoodgoodstudydaydayup/p/3894675.html
Copyright © 2011-2022 走看看