Effective C++(第三版)笔记 ---- 第一部分让自己习惯C++

Posted JimmyTY

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Effective C++(第三版)笔记 ---- 第一部分让自己习惯C++相关的知识,希望对你有一定的参考价值。

内容从侯捷译版的《Effective C++》(第三版)摘录

条款一

C++作为一个多种范式融合的语言,可以看成是语言的联邦,它包含了一下四种主要的次语言:

  • C。C++以C为基础,很多时候C++对于问题的解法其实不过就是较高级的C解法,但是C语言的局限:没有模板,没有异常处理,没有重载。
  • OO C++。包括类,封装,继承,多态,动态绑定。
  • Template C++。 这是C++范型的部分。
  • STL。包括三个主要部分。容器(containers),迭代器(iterator),算法(algorithm)。

高效编程守则视状况而变化,取决于你使用C++的哪一部分。

条款二 尽量以 const, enum, inline替换#define

原因在于,#define RATIO 1.6, 中被替换的记号名称RATIO可能从来都没有出现在symbol table中,这样给debug带来很多困难。

使用const代替#define作为常量时,需要注意对于字符串的使用,即“从右往左读规则”:

 

const char* const authorName = "Meyers"

 

常量的指针变量authorName指向常量的char(s)。

另外,#define不具备封装性,比如作为class的专属常量:

class GamePlayer{
private:
    static const int NumTurns = 5;
    int scores[NumTurns];
    ...
};

然而以上的申明式不会通过某些编译器,所以需要加入一个定义式:

class GamePlayer{
private:
    static const int NumTurns;
    int scores[NumTurns];
    ...
};
const int GamePlayer::NumTurns = 5;

还有一种使用"enum hack"补偿做法,利用了emun的特点来代替常量,来限制不可取地址的常量成员变量:

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

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

而使用template,代替#define就不需要担心这样的不同:
template<typename T>
inline void callWithMax(const T& a, const T& b)
{
    f(a > b ? a : b);
}
  • 对于单纯的常量最好以const对象或者enum代替#define
  • 对于宏函数,最好用inline函数替换#define函数

 

 

 

 

 

 

以上是关于Effective C++(第三版)笔记 ---- 第一部分让自己习惯C++的主要内容,如果未能解决你的问题,请参考以下文章

《Effective Java 第三版》——精华总结

Effective Java第三版 ——用静态工厂代替构造器

Effective Java 第三版——65. 接口优于反射

Effective Java 第三版——48. 谨慎使用流并行

Effective Java 第三版——79. 避免过度同步

Effective Java 第三版——28. 列表优于数组