effectivecpp学习笔记

来源:互联网 发布:专业电脑数据恢复 编辑:程序博客网 时间:2024/06/06 07:37

  • Introduction
  • 构造析构赋值运算

Introduction

  1. C++可视为一个语言联邦,主要由以下四部分组成:C、Object-Oriented C++、Template C++、 STL

  2. 尽量以const、enum、inline替代#define

    宁可用编译器替换预处理器,如下所示:

    const double AspectRatio = 1.653;const char* const authorName = "Scott Meyers";//static and const//只有static const且为整型才能在类声明的时候初始化,也可以在类外初始化//static非const变量必须在类外初始化//const 非static变量必须在构造函数初始化列表中初始化//非static非const必须在构造函数或者构造函数初始化列表中初始化class GamePlayer { public:    static const int NumTurns = 5;    static const double FudegFactor;    static int Num;    const int NumConst; Gameplayer(int a):Numconst(a){}};//static常量定义,位于实现文件内int GamePalyer::Num = 5;const double GamePlayer::fudgeFactor = 1.35

    enum 定义和使用如下:

    enum weekDay{ Sunday = 0,Monday,Tuesday};weekDay myDay = Sunday;

    enum 更像#define而不是 const, 可以取 const 变量的地址而不可以取enum变量的地址

  3. 尽可能使用 const

    a.const 出现在星号左边,表示指针指向的是常量,const出现在星号右边表示指针本身是常量,如下所示:

    const int * Num = 5;int const * Num = 5;//non-const pointer,const dataint * const Num = 5;//const pointer, non-const data

    b.const返回值返回一个常量值,可以避免对返回值的修改,降低因客户错误而造成的意外。

    const可以被施加于任用作用域内的对象、函数参数、函数返回值类型以及成员函数本身。

    const成员函数:

    c.形式为声明时在函数后面加上const,类外定义的时候也需要在后面加上const,如下所示:

    class Text{ public:    int func() const;};int Text::func() const{ return 0;}

    d. const对象只能调用const成员函数,而非const对象既可以调用const成员函数,也可以调用non-const成员函数

    e.const成员函数不可以更改类内任何non-static成员变量,但是如果成员变量是个指针,则可以在 const函数内改变指针所指内容的大小

    f.non-const成员函数可以调用const成员函数,反之不可以

    g.在成员变量前面加mutable关键字,则const成员函数里面可以修改该成员变量的值

  4. 确定对象使用之前已经初始化

    a.对于无任何成员的内置类型,必须手工初始化。对于其他类型,初始化由构造函数实现,此时确保每一个构造函数都将对象的每一个成员初始化

    b.在构造函数里面对成员变量进行赋值是赋值,而不是初始化,在构造函数初始化列表中才是初始化。

    前者首先调用每个成员变量的默认构造函数,然后对他们赋予新值。后者直接对每个成员变量进行复制构造,效率要高

    c.一般来说建议总是使用构造函数初始化列表,如果存在很多的成员变量的话,可以将其中“赋值和初始化表现得一样好的”成员变量移到构造函数中(一般是内置类型)

    d.初始化顺序:基类早于继承类,而成员变量的初始化顺序取决于声明的次序而不是初始化列表中的顺序

    e.static对象,是指寿命从构造出来直到程序结束为止的对象,包括global对象、定义域namespace作用域中的对象、在类内(或函数内、文件作用域内)被声明为static的对象。其中在函数中的static对象为local static对象,其余的为non-local static对象。

    f.定义于不同编译单元的non-local static对象初始化顺序不确定,如果一个编译单元中的non-static对象的初始化用到另一个单元的non-local static对象,则会出问题,解决方法是使用单例模式,即利用函数返回一个static类型的引用,因为C++保证函数内的local static对象会在该函数被调用期间首次遇到该对象时被初始化

    g.引用别的模块的函数:头文件声明,源文件实现,其他模块使用时,直接包含该头文件,注意该函数不能是static的。

构造、析构、赋值运算

0 0