Effective C++学习---01.让自己习惯C++

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

将C++视为一个由相关语言(次语言)组成的联邦,而非单一语言

  • C:C的语法,面向过程编程
  • Object-Oriented C++(C with Classes):在C语言的基础上做的面向对象的扩展,封装、继承、多态,类的构造函数,析构函数,虚函数...面向对象编程
  • Template C++:面向泛型编程
  • STL:标准库

对于内置的数据类型(C-like),pass-by-value(传值)通常比pass-by-reference(传引用)高效,对于Object-Oriented C++用户自定义(user-defined)数据类型,pass-by-reference(传引用)通常比pass-by-value(传值)高效。

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

  • #define ASPECT_RATIO 1.653---------->#define定义的ASPECT_RATIO在预处理阶段被预处理器替换掉,导致编译器编译出错时,并不会直接报ASPECT_RATIO有问题,而是报1.653有错误信息,追踪困难;对于单纯常量,最好以const对象或enum替换#define
  • 对于类中的静态常量,常量声明在类的头文件中,常量定义以及赋予初值在类的实现文件中;如果编译器不支持类型静态常量初始化的话,对于需要使用静态常量的地方可以用enum(枚举类型)代替;
class GamePlayer
{
private:
    static const int NumTurns = 5;//某些编译器可能不支持该操作“in class初值设置”
    int scores[NumTurns];
};

//使用下边方法解决
class GamePlayer
{
private:
    enum {NumTurns = 5};//使用枚举变量 “the enum hack”
    int scores[NumTurns];
};
  • 对于形似函数的宏(macros),最好改用inline函数替换#define

条款3:尽可能使用const

  • 修饰指针时,const在*左侧表示指针指向的对象是常量,const在*右侧表示指针本身是一个常量(注意*的位置)
  • const修改STL迭代器时,就好像T* const,要想表示迭代器指向的对象为常量,应该使用const_iterator
  • const成员函数,允许类的const对象调用const成员函数,与mutable关键字搭配使用
  • 当const版本和非const版本实现等价时----运用const成员函数,实现非const的孪生版本,如在constT& ::operator()[] const的基础上实现T& ::operator()[],主要通过const_cast<T&>(去除常量版本返回值的const)static_cast<const Class&>(*this)(在非const的基础上调用const版本)实现,注意在const版本中调用非const版本是错误的

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

  • 读取未初始化的值,可能会导致不确定的行为
  • 对于不确定编译器是否会进行初始化动作的地方,最好手动进行初始化
  • 对于类的成员变量而言,最好使用member initialization list代替在构造函数内部对成员变量进行赋值
  • 在函数内定义的static变量,被称为local static对象,其他的static变量被称为non-local static对象,c++保证,定义在函数中的local static对象会在该函数首次被调用并遇上该对象的定义式时被初始化。对于non-local static对象(不同编译单元),c++没有规定其初始化顺序,一旦non-local static对象有依赖关系,没有办法确定non-local static对象按规定的顺序初始化

  • 7
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值