Effective c++读书笔记

时间:2022-01-31 07:06:46
1、视C++为一个语言联邦
    C、object-oriented C++、template C++、STL
2、尽可能使用const:
    1)关键字const出现的星号左边,表示被指物事常量;如果出现在星号右边,表示指针自身是常量;如果出现在两边,表示被指物和指针都是常量。
    2)stl迭代器中申明迭代器为const就像申明指针为const一样,表示这个迭代器不得指向不同的东西,但他所指向的东西的值是可以改动的。如果希望所指的东西不可被改动,你需要的是const  iterator。
    3)const成员函数:两个成员函数如果只是常量性不同,可以被重载。如果一个函数的返回类型是个内置类型,那么改动函数返回值从来就不合法。
    4)在const和non-const成员函数中避免重复:第一次这里将*this从其原始类型转为const类型。第二次则是从const operator    []的返回值中移除const。添加const的那次强迫进行了一次安全转型,使用static_cast。移除const的那个动作只可以藉由const_cast完成,没有其他选择。const成员函数调用non_const成员函数是一种错误行为,因为对象有可能因此被改动。
            const char & operator[]()const
            {}
            char & operator[]
            {
                return
                      const_cast<char&>(static_cast<const textblock&>(*this)[position])
            }
请记住:将某些东西申明为const对象可以帮助编译器查找出错误。const可被施加于任何作用于内对象、函数参数、函数返回类型、成员函数本体;当const和non_const成员函数有这实质等价的实现时,令non_const版本调用const版本可避免代码重复。
3、确定对象被使用前已先被初始化
    1)为内置型对象进行手工初始化,因为C++不摆正初始化他们
    2)构造函数最好使用成员初值列,而不要在构造函数本体内使用赋值操作。初值列列出的成员变量,其排列次序和他们在class中申明的次序相同
    3)为免除“跨编译单元之初始化问题”,请以local static对象替换non-local static对象。
4、了解C++默默编写并调用那些函数
    编译器可以暗自为class创建default构造函数、copy构造函数、copy assignment操作符、以及析构函数
5、若不想用编译器自动生成的函数,就该明确拒绝(接4)
    为驳回编译器自动提供的机能,例如copy构造函数、copy assignment操作符等,可将相应的成员函数申明为private并且不予实现。使用像uncopyable这样的base class也是一种方法。
6、为多态基类填加virtual析构函数

polymorphic带多态性质的,base class 应该申明一个virtual析构函数 。如果class带有任何virtual的函数,他就应该拥有一个virtual析构函数;classes的设计目的如果不是为了base class 使用,或不是为了具备多态性,就不该声明virtual析构函数.