Effective C++(1-4)

来源:互联网 发布:睡眠记录的软件 编辑:程序博客网 时间:2024/05/03 20:33

1、C++由以下四个层次组成:

     1.1  纯C 

     1.2  Object-Oriented C++

     1.3  Template C++

           泛型编程,包括template metaprogramming(TMP,模板元编程)

     1.4 STL

          包括容器(containers)、迭代器(iterators)、算法(algorithms)和函数对象(funciton objects)

2.尽量以const,enum,inline替换#define

    2.1 采用define时,记号名称不会进入符合列表,不易调试;对于单纯常量,最好采用const对象或enum。

    2.2 对于形似函数的宏,最好改用inline函数替换#define,易理解

3.尽可能使用const

   3.1 如果关键字const出现在星号左边,表示被指物是常量;如果出现在星号右边,表示指针自身是常量;

         如果出现两边,表示被指物和指针两者都是常量。

         char greeting[] = "Hello";

         char*p = greeting;                   //non-const pointer,non-const data

         const char*p = greeting;         //non-const pointer,const data

         char* const p = greeting;        //const pointer,non-const data

         const char* const p = greeting;   //const pointer,const data

  3.2 const 成员函数

        两个成员函数如果只是常量性不同,可以被重载。

        class TextBlock

       {

            public:

            const char& operator[](int iPosition) const     //for const object

           {return text[iPosition];}

 

            char& operator[](int iPosition)                       //for non-const object

           {return text[iPosition];}

           private:

                  std::string text;

     }

         

     void print(const TextBlock& ctb)

     {

          std::cout<<ctb[0];           //call const TextBlock::operator[]

     }

 

 

     void print(TextBlock& ctb)

     {

          std::cout<<ctb[0];           //call non-const TextBlock::operator[]

     }

    3.3 当const和non-const成员函数有着实质等价的实现时,令non-const版本调用const版本可避免代码重复。

    3.4 C++中,在成员变量前加mutable(可变的),可以使该成员变量在const成员函数内也能被修改。

4.对象初始化

     4.1 C++中,对象的成员变量的初始化发生在进入构造函数本体之前。

     4.2 C++成员初始化顺序:base class早于derived class,而class的成员变量按其声明次序被初始化。

     4.3 C++对"定义于不同编译单元内的non-local static对象"的初始化次序无明确定义。

     4.4 构造函数最好使用成员初值列(member initialization list),而不要在构造函数本体内使用赋值操作。

           初值列列出的成员变量,其排列次序应该和它们在class中的声明次序相同。

     4.5 为避免“跨编译单元之初始化次序”问题,请以local static对象替换non-local static对象,如下:

           class FileSystem {...};

           FileSystem& tfs()

           {

                 static FileSystem fs;

                  return fs;

           }