高效C++:让自己习惯C++

视C++为一个联邦语言

  • 面向过程,面向对象,泛型编程,元编程,C++同时支持,强大而迷惑

  • C++语言可以分为如下4个部分:

    • C,C语言相同

    • C with Class,包括封装、继承、多态...

    • Template C,模板元编程

    • STL,标准C++的一部分,主要是和容器、迭代、算法等有关

  • 每个部分有每个部分自己的高效规则,不通用,注意区分

 

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

  • 以编译器替代预处理器------核心

    • 使用宏报错后,编译器无法提示宏定义的名称,只能提示宏具体的内容

    • 宏定义不会进入到符号表,因此给调试带来一定的麻烦

  • 类中私有的静态变量代替define

const int Test::Num = 5;

class Test
{
private:
    static const int Num;
    int Data[Num];
}
  • 以枚举代替define

class Test
{
public:
    enum DATATYPE {ONE = 1, TWO = 2}; //作用域为类内,类外加类名访问
}
  • 以inline替代define

template<typename T>
inline void Max(const T& lhs, const T& rhs)
{
    //函数实现
}

替代

#define Max(a, b) ((a) > (b) ? (a) : (b)
  • enum和#define不能取地址

  • 对于单纯的常量定义,以const或enum代替define

  • 对于函数宏,以inline函数代替

 

尽可能使用const

  • 原因:

    • 明确变量和方法的行为

    • 防止误赋值的情况

  • const可以声明任何变量、对象、参数、函数返回类型、成员函数本体

  • 当const和no-const成员函数功能相同时,no-const使用类型转换调用const函数

const_cast:移除变量的const属性
static_cast:
    1)完成基础数据类型
    2)同一个继承体系中类型的转换 
    3)任意类型与空指针类型void*之间的转换
dynamic_cast:
    使用多态的场景,有继承,有虚函数,向下转型时使用
reinterpret_cast:
    1)改变指针或引用的类型
    2)将指针或引用转换为一个足够长度的整形、将整型转换为指针或引用类型
    3)不知道用哪一个类型转换就用它

 

确认对象在使用前已经初始化

  • 最简单的规则,往往最容易被忽视,就像面向对象设计原则中类的单一原则,一不小心就被忽视了,然后导致“破窗”

  • 确认所有的成员变量都在初始化列表中进行初始化,不要等到在构造函数的函数体中进行赋值

  • 以函数内的static变量代替全局变量(因为全局变量的初始化和使用可能在不同的任务中),解决全局变量先使用后初始化的问题

extern int g_data;

int& getData()
{
    static int data;
    return data;
}
posted @ 2019-09-02 16:08  Yong_无止境  阅读(222)  评论(0编辑  收藏  举报