Effective STL 01 ~ 03

本博客记录Effective STL 的55个条约,方便大家记录与查找。

条约01: 视c++为联邦性语言

   可以把c++ 看成4个次语言:

  • c语言.  c++毕竟是c语言的基础。包含了c语言的特性,比如数组,指针,等等。
  • Object-Oriented c++.  这部分就是 c with Class,classes(构造函数与析构函数),封装,多态,继承,virtual函数
  • Template.  模板元编程(TMP),也是c++的范型编程。
  • STL. stl是template的库,它对容器、迭代器、算法、以及函数对象有紧密配合与联系。

  所以说是联邦性语言,当你编程的时候,你所编程的东西,应该清楚记得属于那部分语言,有助于你使用。(个人看法)

条约02: 尽量以const,enum,inline 替换 #define

#define  ASPECT_RATIO 1.653

     替换为:

const  double AspectRatio = 1.653;

 #define  是预处理器处理的结果,编辑器是看不到结果的,在后期调试的时候会很浪费时间。

基本原因:你所使用的名称可能并没有进入记号表(symbol table

接下来来看一个例子:

#include <iostream>
using namespace std;

#define CALL_WITH_MAX(a, b)  ((a) > (b) ? (a):(b))

int main()
{
    int a = 5, b = 0;
    CALL_WITH_MAX(++a, b);
    cout << "a = " << a << " b = "<< b<<endl;
    a = 5, b = 0;
    CALL_WITH_MAX(++a, b+10);
    cout << "a = " << a << " b = " << b << endl;
    return 0;
}

我们运行看结果:

a = 7  b = 0
a = 6  b = 0
请按任意键继续. . .

  第一个a 居然加了两次, 第2个a只加了一次,这样去写完全结果不是我们想要的,与函数想表达的不一致。

     所以替换为:

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

这样我们就解决问题了。

所以记住:

  • 对于单纯的常数,最好以const,enums,来替换#define
  • 对于宏函数,尽量改为inline函数替换#define

条约03: 尽可能使用 const

  •     将某些东西声明为const 可帮助编辑器侦测出错误方法:const int a = 3;   if(a = b),这样就会报错
  •     编辑器强制实施 bitwise constness,编写的时候应该使用“概念上的常量”
  •     当const 与 non-const 等价的时候,non-const版本调用 const版本可避免代码重复
发布了26 篇原创文章 · 获赞 7 · 访问量 4302

猜你喜欢

转载自blog.csdn.net/weixin_42126427/article/details/104381413