zoukankan      html  css  js  c++  java
  • Exceptional C++

    * 使用常引用const & 代替值传递

    * 使用先增操作,避免使用后增操作:在进行后增操作时,对象不但需要自增,还要返回一个包含自增前值得临时对象。

    * 遵循‘单入口/单出口’原则,绝不要在一个函数里面写有多个return语句。

    * 绝对不要返回对局部对象的引用!!!

    * 尽量使用标准库算法

    * 优先采用 "a opt= b" 这样的写法, 而不是 "a = a opt b"; :原因在于opt += 这个云算法是直接对其左边的对象进行运算,并且返回的是一个引用,而不是一个临时变量。
    而opt +则必须返回一个临时对象。

    * 如果定义了谋运算符,那么通常还应该同时定义与这个云算法相对应的赋值运算符,并用后者来实现前者。而且,还应该维护opt 与 opt= 之间的自然关系。

    * 在C++标准中规定: 运算符 =、()、[]、->必须被定义为成员函数,而在类中定义的new、new[]、delete、delete[]等运算符函数则必须是静态成员函数。
    如果运算符函数是用于流I/O的 >>或者<<;或者如果运算符函数需要对其做操作数进行类型转换;或者运算符函数可以通过类的共有接口来实现:那么将这个函数定义为非成员函数。

    * 在函数operator<< 和 operator>>中应始终返回对流对象的引用

    * 为了保值代码的一致性,应该通过前置递增来实现后置递增。

    * 如果派生类中定义的函数与基类中的函数同名,并且你不想隐藏基类中的函数,那么应该通过using声明语句将基类的这个函数引入到派生类的作用域中 eg: using Base::f;

    * 永远不要改变被覆盖的基类函数的默认参数值

    ** 除了对真正的 is-a 和 works-like-a 关系进行建模外,永远不要使用公有继承。。所有被覆盖的成员函数不能超过实际需求的范围,同时也不能小于这个范围。
    使用公有继承的目的是重用代码(编写以多态的方式使用基类对象的代码),而重用代码并不一定要使用公有继承。

    ** 对"is implemented in terms of"这种关系建模时,应该优先选择成员关系/包含的方式,而不是私有继承的方式。只有非用继承不可时,才应该使用私有继承---也就是说,当需要访 问保护成员或者需要覆盖虚函数时,才使用私有继承。永远都不要只是为了代码重用而使用公有继承。

    * 尽量避免使用共有的虚函数,优先选择模板方法这种设计模式:通过这种方法构造出完成某项工作的通用方式,并且在完成这项工作是总是遵循着相同的步骤。

    ** 对于广泛使用的类,应该优先采用编译器防火墙这种惯用法(Pimpl惯用法)来隐藏实现细节,通过一个不透明的指针(指向一个进行了前置声明但有没有定义的类)来保存私有成员,
    声明这个指针时可采用struct XxxImpl* pimpl_;这种方式:
    Class Map {
    private: struct MapImpl;
    MapImpl* pimpl_;
    }

    * 包含,也可以叫做“聚合”、“分层”,“Has-a”或者“委托(delegation)”。优先使用包含而不是继承。对 Is-Implemented-terms-of这种关系建模时,应优先使用包含而不是继承。

    * 如果类中定义了new(new[])或delete(delete[])中的任意一个运算符,那么也要同时定义另一个运算符。

    * 应该显式地将函数operator new() 和 Operator delete()声明为静态函数。他们永远都不能成为非静态成员函数。

    * 永远不要通过多态的方式处理数组, 优先选择使用vector<> 或 deque<> 而不是数组。

    * 使用构造函数来实现拷贝赋值运算符函数时,绝不要使用如下技术:首先一个显示地析构函数,紧随其后是placement new 语句。

    * 如果可能的话,优先使用 T t(u);这种形式,而不是 T t = u; 这种形式。

    * 在函数声明中,如果参数是以值方式传递的,则不要使用const,而如果在这个函数定义中,参数是不能被修改的,那么应该使用const。

    * 对于不是内置类型的返回值来说,当使用返回值的方式而不是返回引用的方式时,应该优先选择返回const值。

    * 避免使用全局变量或静态变量。如果必须使用,那么一定要特别注意这些变量的初始化顺序。

  • 相关阅读:
    [hdu5136]Yue Fei's Battle 2014 亚洲区域赛广州赛区J题(dp)
    Codeforces Round #280 (Div. 2)E Vanya and Field(简单题)
    [hdu5113]Black And White2014北京赛区现场赛B题(搜索加剪枝)
    BestCoder Round #20 部分题解(A,B,C)(hdu5123,5124,5125)
    2014年亚洲区域赛北京赛区现场赛A,D,H,I,K题解(hdu5112,5115,5119,5220,5122)
    UVA 11754 Code Feat (枚举,中国剩余定理)
    Codeforces Round #277.5 (Div. 2) A,B,C,D,E,F题解
    UVA 11426 GCD
    UVALive 4119 Always an integer (差分数列,模拟)
    UVA 10253 Series-Parallel Networks (树形dp)
  • 原文地址:https://www.cnblogs.com/shuang0109/p/9828970.html
Copyright © 2011-2022 走看看