C++编程规范指46:如果提供专门的new,应该提供所有标准形式(普通、就地和不抛出)

摘要:

    不要隐藏好的new:如果类定义了operatornew 的重载,就应该提供operator new 所有三种形式——普通(plain)、就地(in-place)和不抛出(nothrow)的重载。

    很少需要提供自定义的new 或者delete,但是如果确实需要,通常也不想隐藏内置的签名。

C++中,在某个作用域(比如一个类作用域)里定义了一个名字之后,就会隐藏所有外围作用域中(如,在基类或者外围名字空间)同样的名字,而且永远不会发生跨作用域的重载。当上述名字是operator new时,需要特别小心,以免对类的客户产生不良影响。

    假设我们定义了一个类专门的operatornew:

Class C

{

         //……

         Static void* operatornew(size_t,void*);//隐藏三种常规形式

};

    然后,如果有人试图编写一个和普通旧式newC一样无趣的表达式,编译器会拒绝对其进行编译,其根据是无法找到普通旧式的operator new。生命接受一个memorypool为参数的C::operator new重载,将隐藏所有其他重载,包括我们都熟知而且爱用的内置全局版本,也就是:

Void* operatornew(std::size_t);//普通new

Void* operatornew(std::size_t,std::nothrow_t) throw();//不抛出new

Void* operatornew(std::size_t,void*);//就地new

    或者,类也可能对以上三种operatornew 之一提供自己专用的版本。在此情况下,如果声明了其中之一,默认时类将屏幕其他两个:

Class C

{

         //……

         Static void* operatornew(size_t,void*);//隐藏其他两种常规形式

};

    应该让类C在作用域中显式地声明operatornew 的所有三种标准变体。通常,所有三种形式都有相同的可见性。(各个形式还可以将可见性设为private,比如要显示地禁用普通或者不抛出operator new,但是本条款的目的是提醒读着记住不要因为疏忽而隐藏它们。)

    请注意,应该总是避免就地new,因为它在STL容器中有广泛的使用。

    最后一个技巧是:在两种不同的环境下,公开已隐藏的operator new需要采用来年各种不同的方式。如果类的基类也定义了operator new,那么要公开operator new所需做的就是:

Class C:public B

{

         //……

         Public:

         Using B::operator new;

};

    否则,如果没有基类版本或者基类没有定义operatornew,就需要写一些短小的转送函数(因为无法通过using从全局名字空间中导入名字):

Class C

{

         //……

         Public:

         Static void* operator new(std::size_t s)

         {

                   Return ::operator new(s);

}

Static void* operator new(std::size_t s,std::nothrow_t nt) throw()

{

         Return ::operator new(s,p);

}

};

    上面的建议也适用于数组形式的operatornew[]和operator delete[]。

    避免在客户代码中国调用new(nothrow)版本,但是仍然要为客户提供,以免客户一旦要用到时感到奇怪。

时间: 2024-12-01 05:27:29

C++编程规范指46:如果提供专门的new,应该提供所有标准形式(普通、就地和不抛出)的相关文章

C++编程规范指47.以同样的顺序定义和初始化成员变量

摘要:    与编译器一致:成员变量初始化的顺序要与类定义中声明的顺序始终保持一致,不用考虑构造函数初始化列表中编写的顺序.要确保构造函数代码不会导致混淆地指定不同的顺序. 考虑以下代码: <span style="font-size:18px;">class Employee { string emall_,firstName_, lastName_; public: Employee(const char*firstName, const char* lastName)

JAVA 编程规范

编程|规范 1. 应用范围 本规范应用于采用J2EE规范的项目中,所有项目中的JAVA代码(含JSP,SERVLET,JAVABEAN,EJB)均应遵守这个规范.同时,也可作为其它项目的参考. 2. 设计类和方法 2.1 创建具有很强内聚力的类 方法的重要性往往比类的重要性更容易理解,方法是指执行一个统一函数的一段代码.类常被错误的视为是一个仅仅用于存放方法的容器.有些开发人员甚至把这种思路作了进一步的发挥,将他们的所有方法放入单个类之中. 之所以不能正确的认识类的功能,原因之一是类的实现实际上

11个PHPer必须要了解的编程规范_php技巧

本文将讨论常用的良好的代码习惯,或者称为代码规范,在PHP领域. 1,错误报告开启 错误报告是在PHP中一个非常有用的功能,应同时在开发阶段启用. 这可以帮助我们确定我们的代码中的问题. 最常用的功能是"E_ALL",这有助于我们发现所有的警告和严重错误. 必须指出的是,我们把我们的代码投入上线前,我们应该关闭这个功能提示,否则会在浏览器上的暴漏所有潜在错误及警告. 2,使用DRY原则 'Do not Repeat Yourself',DRY原则指的是不要重复你的代码.. 这个概念是一

Visual Basic编程规范

visual|编程|规范 Visual Basic编程规范 1.      Visual Basic IDE(集成开发环境)设置        必须打开设置选项的"要求变量声明","对齐控件到网格","自动缩进"开关.        Tab的宽度统一为4个空格,网格单位一律设为:width 60 height 60. 2.     命名约定        (注意:在任何时候,不能使用中文及全角字符,只允许使用英文字母.下划线和数字) 2.1   

IDesign C#编程规范(二)

编程|规范 续之一,小鸡射手接着翻译了IDesign编码规范的第二章前部. 2 编码惯例 Coding Practices 1. 避免在一个文件中放多个类. Avoid putting multiple classes in a single file. 2. 一个文件应该只对一个命名空间提供类型.避免在同一文件中有多个命名空间. A single file should only contribute types to a single namespace. Avoid having mult

IDesign C#编程规范(之四)

编程|规范 续之三,本文是IDesign C#编程规范的第三章. 3 项目设置和项目结构 Project Settings and Project Structure 1. 总是以4级警告建立项目(图略). Always build your project with warning level 4 2. 在发布版中将警告作为错误(注意这不是VS.NET的缺省设置)(图略). Treat warning as errors in Release build (note that this is

《C++编程规范:101条规则、准则与最佳实践》——第2章设计风格设计风格 C++编程规范:101条规则、准则与最佳实践 复杂性啊,愚人对你视而不见,实干家受你所累。 有些人避而远之。惟智者能够善加消除。 ——Alan Perlis 我知道,但是却又忘记了Hoare的至理名言:不成熟的优化是程

第2章设计风格 C++编程规范:101条规则.准则与最佳实践 复杂性啊,愚人对你视而不见,实干家受你所累. 有些人避而远之.惟智者能够善加消除. --Alan Perlis 我知道,但是却又忘记了Hoare的至理名言:不成熟的优化是程序设计中的万恶之源. --Donald Knuth[1] The Errors of TeX[Knuth89] 完全区分设计风格与编码风格是非常困难的.我们将一般在实际编写代码时才用得到的条款留到下一部分介绍. 本部分集中讨论适用面比一个特定的类或者函数更广的原则和

《C++编程规范:101条规则、准则与最佳实践》——导读

前言 C++编程规范:101条规则.准则与最佳实践尽早进入正轨:以同样的方式实施同样的过程.不断积累惯用法.将其标准化.如此,你与莎士比亚之间的唯一区别将只是掌握惯用法的多少,而非词汇的多少. --Alan Perlis[1]} 标准最大的优点在于,它提供了如此多样的选择. --出处尚无定论 我们之所以编写本书,作为各开发团队编程规范的基础,有下面两个主要原因. 编程规范应该反映业界最久经考验的经验.它应该包含凝聚了经验和对语言的深刻理解的公认的惯用法.具体而言,编程规范应该牢固地建立在大量丰富

实现高效Java编程规范的十一条基础规则

编程|规范 本文介绍的Java规则的说明分为5个级别,级别1是最基本也是最重要的级别,在今后将陆续写出其他的规则.遵守了这些规则可以提高程序的效率.使代码有更好的可读性等. (1) 避免使用NEW关键字来创建String对象 把一个String常量copy到String 对象中通常是多余.浪费时间的. Public class test{ Public void method(){ System.out.print (str); } private String str = new String