0
点赞
收藏
分享

微信扫一扫

effective c++笔记1.7

微笑沉默 2022-01-07 阅读 49
c++

01 视c++为一个语言联邦

四个主要次语言:

C:区块、语句、预处理器(2)、内置数据类型、数组、指针…

面向对象:类、封装、继承、多态、虚函数…

模板(41、46):泛型,模板元编程(48)

STL:容器、迭代器、算法、函数对象

——对内置类型,按值传递比按引用传递更高效,对于面向对象、模板引用更高效,对于STL迭代器和函数对象(用C指针塑造)则选择按值(20)

02 尽量以const enum inline替换#define

“宁可以编译器替换预处理器”:

1.用const常量替换宏:

浮点常量码量小,如果用#define可能导致出现多份

【特殊】(1)定义常量指针需要两次const,string比char*更好

                (2)class专属常量成员,作用域在类内,可封装:常量声明式static const=…+类外定义式(整数类型不取地址无需提供),#define不能实现(宏被定义后就有效,没有作用域概念)

class GamePlayer{
private:
    static const int NumTurns = 5;//常量声明式(头文件)
    int scores[NumTurns];//使用常量
};
const int GamePlayer::NumTurns;//类外定义(放在实现文件里),不给予数值,整数类(ints chars bools)常量不取地址不用定义

//初值放在定义式:
class CostEstimate{
private:
    static const double FudgeFactor;//常量声明式(头文件)
    
};
const int CostEstimate::FudgeFactor = 1.35;

2.用enum替换#define:

*若class编译期间需要一个class常量值,例如上述数组声明式编译器需要在编译期间知道数组大小,若不允许“in class 初值设定”,改用“the enum hack”补偿:

class GamePlayer{
private:
    enum { NumTurns = 5 };
    int scores[NumTurns];
};

——enum hack:

(1)const可以取地址,enum不能取地址,更像#define。如果不想让人指针或引用你的整数常量可以用enum约束(18)。

(2)enum和#define一样不会导致非必要内存分配,不够优秀的编译器可能为整数型const对象设定另外的存储空间

(3)enum back 模板元编程(48)

3.用inline替换形似函数的宏:

如果用#define实现宏,不是函数,容易多次核算出错;用inline写的是函数,遵守作用域和访问规则,例如可以写类内函数,宏不能。

#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+10);//a累加一次

template<typename T>
inline void callWithMax(const T& a, const T& b)
{
f(a > b ? a : b);
}

——有了const enum inline,对于预处理器需求降低,但仍要用#include,#ifdef/ifndefkong控制编译。

举报

相关推荐

0 条评论