1.让自己习惯C++

127 阅读2分钟

条款01 视C++为一个语言联邦

将C++看成一个语言联邦 由4种次语言组成 将4种次语言单独分离开来看

  • C语言
  • Object-Oriented C++ (面向对象)
  • Template C++ C++泛型编程的部分组成
  • STL

条款02 尽量使用const,enum,inline替换#define

  • 对于纯常量 用const对象或enums替换#define
  • 对于形似函数宏,用inline函数替换#defines

cpp #define ASPECT_RATIO 1.653 这样写可能造成如下错误和模糊

  • 记号名称ASPECT_RATIO可能从未被编译器看见,记号可能不能进入symbol table

解决之道 cpp const double ASPECT_RATIO = 1.653;

当以常量替换#define有如下情况值得提及

  • 定义常量指针
  • class的专属常量
class Game{
private:
    static const int NumTurns = 5;//常量声明式
    int score[NumTurns];
public:
    const int * address = &NumTurns;
};
//当我们需要取常量的地址或者想看到常量的定义时对其进行定义
const int Game::NumTurns ; // 声明式

tips:

  1. #define不能用来定义class的专属常量也不能提供任何的封装性

the enum hack

class Game{
private:
    enum {NumTurns = 5};
    int score[NumTurns];
};
  • 某种意义下enum更像#define而不像const 取一个const地址合法 而取一个enum不合法
  • template programming 基础技术就是enum hack

用inline替换#define

#define CALL_WITH_MAX(a, b) f((a) > (b) ? (a) : (b))
int a = 5, b = 0;
CALL_WITH_MAX (++a, b); //a 被累加二次
CALL_WITH_MAX(++a, b+lO);//a 被累加一次

这么恶心的东西狗都不用

template<typename T> //由于我们不知道
inline void callWithMax(cons T& a, canst T& b) / /T 是什么,所以采用 / /pass by reference-to-const.
{
f (a > b ? a : b); //见条款 20.
}

条款03 尽量使用const

const指针

  • const出现在星号左边表示指针所指的量不可改变,出现在右边表示指针自身的值不可改变
  • STL中迭代器也是模拟指针实现的 const vector<int> :: iterator iter //类似T * const vector<int> :: const_iterator iter // 类似 const T *
  • 让函数返回一个常量值,往往可以降低因为客户错误而造成的意外

const成员函数

作用

  • 使class接口比较容易理解
  • 使操作const对象成为可能

条款4 确定对象被使用前已先被初始化

  • 为内置类型对象进行手工初始化
  • 构造函数最好使用成员初始列,而不要在构造函数中进行赋值操作.初始列列出的成员变量,其排列次序应该和它们在class中声明次序相同
  • 为避免"跨编译单元之初始化次序问题",用local static对象替换non-local static对象