Effective C++改善程序与设计的55个具体做法笔记

目录

1 让自己习惯C++

Item1:将C++视为federation of languages

Item2:用consts、enums和inlines取代#define

Item3:尽可能的使用const

Item4:确定对象被使用前已经先被初始化

2 构造、析构和赋值运算

Item5:了解C++默认编写并调用哪些函数

Item6:若不想使用编译器自动生成的函数,就该明确拒绝

Item7:为多态基类声明virtual析构函数

Item8:别让异常逃离析构函数

Item9:绝不在构造和析构过程中调用virtual函数

Item10:令oprator=返回一个reference to *this

Item11:令oprator=中需要考虑自我赋值

Item12:复制对象时勿忘其每一个成分

Item13:以对象管理资源

 Item14:在资源管理类中小心coping行为

 Item15:在资源管理类中提供对原始资源的访问

 Item16:成对使用new和delete时要采用相同形式。

 Item17:以独立语句将newed对象置入智能指针。

 Item18:让接口容易被正确使用,不易被误用。

 Item19:设计classs犹如设计type。

 Item20:宁以pass-by-reference-to-const替换pass-by-value。

 Item21:必须返回对象时,别妄想返回其reference。

 Item22:将成员变量声明为private。

 Item23:宁以non-member non-friend函数代替member函数。

 Item24:若所有参数皆需要类型转换,请为此采用non-member函数。

 Item25:考虑写出一个不抛异常的swap​​​​​​​


1 让自己习惯C++

Item1:将C++视为federation of languages

Item2:用consts、enums和inlines取代#define

        限定作用于,会放在常量区,但枚举不占用对象的存储空间,除非是枚举变量。

Item3:尽可能的使用const

        const成员函数,相当于const this对象,可以操作const对象和不改变对象,两个成员函数如果只是常量性不同可以重载。

        const写在类型之前或者类型之后都是可以的,表示指物是常量,也就是指针常量  

const int *a;
int const *a;

Item4:确定对象被使用前已经先被初始化

        1、初始化列表经常用于自定义类,但const、references成员变量也要用初始化列表初始化。

        2、C++对定义于不同的编译单元内的non-local static 对象的初始化相对次序没有明确定义。

2 构造、析构和赋值运算

Item5:了解C++默认编写并调用哪些函数

        编译器可以暗自为class创建default构造函数、copy构造函数、copy assignment操作符以及析构函数。

Item6:若不想使用编译器自动生成的函数,就该明确拒绝

        将成员函数声明为private而且故意不实现他们。

Item7:为多态基类声明virtual析构函数

        只要当class内含有至少一个virtual函数,它就应该拥有一个virtual析构函数

        polymorphic(带多态性质的)base class应该声明一个virtual析构函数。

Item8:别让异常逃离析构函数

Item9:绝不在构造和析构过程中调用virtual函数

        在base classs构造期间,virtual函数不是virtual函数。

        对象在derived class构造函数开始执行之前不会成为一个deriver class队形。

Item10:令oprator=返回一个reference to *this

Item11:令oprator=中需要考虑自我赋值

        异常安全一般自动获得自我赋值安全的回报

Item12:复制对象时勿忘其每一个成分

        Copying函数应该确保复制“对象内的所有数据成员变量”以及所有“base class成分”.

        不要尝试以某个copy函数去实现灵一个copy函数,应当将共同机能放进第三个函数中,并有两个copy构造函数和copy assignment函数使用,消除共同代码。

Item13:以对象管理资源

        获得资源后立即放进管理对象,Resource  Acquisition Is Initialization(RAII)。

 Item14:在资源管理类中小心coping行为

 Item15:在资源管理类中提供对原始资源的访问

        对原始资源的访问可以显示转换或隐式转换,一般而言显示转换比较安全,但隐式转换对客户比较方便。

 Item16:成对使用new和delete时要采用相同形式。

 Item17:以独立语句将newed对象置入智能指针。

 Item18:让接口容易被正确使用,不易被误用。

 Item19:设计classs犹如设计type。

        尽量以pass-by-reference-to-const替换pass-by-value,前者通常比较高效,并可避免切割问题。

        以上规则并不适用于内置类型,以及STL的迭代器和函数对象,对它们而言,pass-by-value往往比较合适。

 Item20:宁以pass-by-reference-to-const替换pass-by-value。

 Item21:必须返回对象时,别妄想返回其reference。

 Item22:将成员变量声明为private。

 Item23:宁以non-member non-friend函数代替member函数。

 Item24:若所有参数皆需要类型转换,请为此采用non-member函数。

            只有当参数位于参数列,这个参数才是隐式类型转换的合格参与者。但记住类型转换函数和转换构造函数一般只有一个,此处指的是转换构造函数

 Item25:考虑写出一个不抛异常的swap

        我们通常不能够(不被允许)改变std命名空间内的任何东西,但可以被允许为标准的templates(如swap)制造特化版本,使它专属于我们自己的classes。

class Widget {
public:
    void swap(Widget &other){
        using std::swap;
        swap(pImple,other.pImpl);
    }
   
};
template(typename T>
void swap(Widget& a,Widget& b){
      a.swap(b);
} 
namespace std{
    template
    void swap( T& a, T& b ){
        T temp(a);
        a = b;
        b = temp;
    }
    template//重载,但不能加入到std中
    void swap(Widget& a,Widget& b){
        a.swap(b);
    } 
    template<>//全特化
    void swap(Widget &a,Widget &b){
        a.swap(b);
    } 
}

你可能感兴趣的:(C++和大数据,c++)