Effective C++手记1

EffectiveC++手记

1      视C++为一个语言联邦

C,object-oriental C++, TemplateC++, STL的联合

同时支持过程式,面向对象式,函数式,泛型式,模板元编程式的语言。

2      尽量以const,enum,inline代替#define

2.1  采用这种方案基于以下几点

目标代码的大小,占用内存少,是否编译时候求值,作用域大小,函数调用开销

1.        #define的目标代码可能更大,这是由于同一个define标记可能会出现多个地方;使用变量不会出现这个问题,占用内存相对会更多。

2.        类体内声明变量如果立刻用到它,会用到编译时求值,const变量可能不适合,enum也许会更有用。而且它比define的作用域更小,更好。

3.        inline取代宏函数,带来类型安全的优点。

2.2  如何使用

const int NumTurns = 5;

enum{ NumTurns = 5};

template < typename T>

inline const T& Max(const T& a,const T& b)

{

         returna > b ? a :b;

}

3      尽可能使用const

3.1  基于以下几点

传对象参以传递const引用代替传value,省去临时对象的开销。

const限制省去可能出现的问题。

3.2  问题

const成员函数不要返回指向内部对象的non-const引用。由于const成员函数宣称不改变对象内容,如果返回引用会给外部调用者一个handle,因而获取了改变内部对象的权限。

3.3  优秀代码

class TextBlock

{

public:

         constchar& operator[](size_t pos) const

         {return pText[pos]; }

         char&operator[](size_t pos)

         {return pText[pos]; }

private:

         stringpText;

};

//const成员函数返回内部对象的时候加上const引用限制,const和non-const可以重载

3.4  优秀代码2

class TextBlock

{

public:

         constchar& operator[](size_t pos) const

         {return pText[pos]; }

         char&operator[](size_t pos)

         {return const_cast<char&> (static_cast<const TextBlock&>(*this)[pos]);}

private:

         stringpText;

};//这种方式在const成员函数的内部处理非常复杂的时候非常有用,通过non-const调用const成员函数来完成任务。

3.5  使用范围

迭代器,指针,引用,函数参数,返回值,本地变量,成员函数

4      确定对象在使用前已经被初始化

l  手工初始化所有的内置类型变量

l  构造函数尽量使用成员初始化列表,成员初始化顺序依赖于成员声明次序。

l  跨编译单元的初始化,通过使用local static代替non-local static,类似于单例模式的工作性质,函数返回指向local static对象的引用

l  遇到从文件中读取数据进行成员初始化从而引起多个构造函数的代码重复的问题,可以通过声明一个private方法初始化成员,供构造函数调用。

你可能感兴趣的:(Effective C++手记1)