effective c++ 读书笔记(1)

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

  • 注意 当需要一个常量的作用域限制在类中时,需要将其定义为成员,当只能有一个实体时,定义为static,此时若不需要取地址,则无需定义,
class GamePlayer{
private:
	static const int NumTruns = 5; //声明式
	int scores[NumTruns];
}
  • 当需要取地址时,需要在实现文件(非头文件中)进行定义
const int GamePlayer::NumTurns;

记住:

  • 对于单纯常量,最好一const对象或者enums替换#define
  • 对于形似函数的宏,以inline替换

03 尽可能使用const

  • 左边的const 是底层const,指指针指向的类型是const。在右边的const是顶层const,指针是const
  • 想要在const成员函数中修改的成员,在声明时加上mutable
    记住:
  • 将某些东西声明成const可以帮助编译器检测出错误用法,const可以被施加于任何作用域对象,函数参数,函数返回类型,成员函数
  • 编译器强制实施bitwise constness,但是编程时应该使用“概念上的常量性”
  • 当const和non-const成员函数有实质是等价的实现时,让non-const调用const版本,避免代码重复

04确定对象使用前已经被初始化

记住:

  • 为内置对象进行手工初始化,因为c++不保证初始化他们
  • 构造函数最好使用成员初值列(member initialization list),而不是在构造函数本体内赋值,初值列列出成员变量,其排序应该和class声明顺序相同
  • 为免除“跨编译单元初始化次序”问题,以local static对象替换non-local static对象

第二条:

  • c++规定,对象的成员变量(除了内置类型)的初始化动作发生在进入构造函数的本体之前,构造函数本体中的是赋值而非初始化,在进入构造函数本体前,就会调用那些成员的默认构造函数,然后再进入本体,进行赋值,这导致之前的默认构造函数无意义,因此使用初始化列表。
  • 当使用默认构造时,同样可以使用初始化列表,只要指定为空就行如
class A{
	A(): a(),s(),list(0){}
int a;
string s;
list<A> list;
}
  • 某些成员其赋值和初始化的效率一样的好(比如内置类型),而一个类中有多个构造函数,那么会有多个初始化列表,出现过于重复的代码,那么可以适当的在初始化列表中漏掉那些成员,并在paivte中写一个函数为其赋值,以供构造函数调用,通常在“成员变量的初值由文件或者数据库读入时”使用

  • non-local static对象:

static对象其寿命,从构造出来直到程序结束,在main函数结束时自动销毁,调用析构函数
编译单元,单一源码文件加上头文件
c++对于不同编译单元内的non-local static对象的初始化没有明确定义

  • 第三条,当初始化一个类B时,需要用到其他编译单元的对象A,这时候就必须要确保在B初始化时,A一定要初始化完成,因此使用一个函数代替对象A,那个函数将返回一个A。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值