小结

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

  1. cpp内部包含四个次语言,c、object c++(也就是面向对象那一套)、template c++(泛型编程、模板元编程)以及STL
  2. 每个次语言的规则以及特性有所不同,比如c中内置类型pass-by-value比pass-by-reference更高效

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

define定义常量

  1. 可以使用全局const常变量来代替,如#define PI 3.14 ==> int const Pi = 3.14,是该定义(包括指针常量)是可以出现在头文件的,因为此时变量没有共享性,但是如果又有extern修饰,就具有共享性,不能违反单一定义原则
  1. 在类中,如果需要#define定义的常量,则可以使用static const int n = 10;来代替,可以不在外面重新定义,此时编译器会把n作为编译时常量来对待,即可用于声明数组个数
  2. enum hack,一个属于枚举类型的数值可权充int使用,这样可以实现一个专属于某一个类的编译器常量 image.png

define定义函数

  1. 即使加上了括号,如果传入i++基本都会出问题
  2. 使用inline+template来替代宏函数

条款 03:尽可能使用const

const与对象

  1. const A a;,对象a直接访问非mutable成员数据修改或调用成员方法修改,都是不行的
  2. 调用的成员方法是const修饰的,否则会报错

const与迭代器

  1. const vector<int>::iterator iter = vec.begin(),声明iter本身是不变的,
  2. const_iterator iter是声明iter指向的对象不可变化

const与函数声明

  1. const与返回值,比如operator*()最好返回const,避免用户代码if((a*b)=c)
  2. const与参数,如果内部不需要修改该参数,尽量使用const修饰

const与成员函数

  1. 原因:外部如果是const声明的对象,调用的方法就是const修饰的,const成员变量是声明不会改变对象内部非mutable数据成员的
  2. 其实const修饰的是参数this
  3. 同时const修饰底层指针,会构成重载,non-const优先调用non-const成员函数,const只能调用const成员函数,也就是成员函数有const修饰会重载
  4. bitwise const是对象占据的内存值不会发生改变,cpp中对于const就是这样想的
  5. logic const是能修改mutable修饰的成员
  6. 尽量使用non-const调用const成员函数,来减少重复代码

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

  1. c-part-of-cpp 是不会初始化的(比如array),而其他部分是会初始化数据的(比如vector)
  2. 对象数据成员的初始化发生在进入构造函数本体之前,构造函数本体都是赋值
  3. 在初始化列表中列出所有数据成员
  4. static变量是存储在数据区,而不是heap、stack
  5. local static object是指函数中声明定义的static变量,会在程序启动时就在数据区分配空间,初次运行到定义处进行初始化,线程安全
  6. non-local static object,包含全局static、类中static以及命名空间内的static,在main运行前初始化,但是存在跨编译单元初始化顺序不确定问题,解决方案是用local static替换non-local static
本站提供的所有下载资源均来自互联网,仅提供学习交流使用,版权归原作者所有。如需商业使用,请联系原作者获得授权。 如您发现有涉嫌侵权的内容,请联系我们 邮箱:[email protected]