Effective C++ 01 ~ 04 条款 让自己习惯C++ 视C++为一个语言联邦 尽量以const,enum,inline替换#define 尽可能使用const 确定对象被使用前已被初始化

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

C++ 由四个次语言构成

1 . 说到底C++仍是以C为基础

区块(blocks)、语句(statements)、预处理器(preprocessor)、内置数据类型(built-in data types)、数组(arrays)、指针(pointers)都来自与C

2. Object-Oriented C++(面向对象)

classes(包括构造函数和析构函数),封装(encapsulation)、继承(inheritance)、多态(polymorphism)、virtual函数(动态绑定)……等等。

3. Template C++ (模板)

C++ 泛型编程

4. STL

STL 是个template程序库

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

原因1是#define不被看作语言的一部分,导致你所使用名称可能并未进入记号表

原因2预处理器盲目地将宏名称替换,可能导致出现多份替换后的值,而用常量就不会出现这个原因

原因3因为#define实现宏看起来像函数,但会带来额外开销,用template inline 取代

特殊情况

1. 定义常量指针时 不止是要将指针所指声明为const 还要将指针本身定义为const

const char * const MyName = "Liu Rongfa "
// const 两次

2. class 专属常量还必须加一个static ,#define 不能创建class专属变量,因为define不注重作用域

class LRF{
private :
	static const int a = 1;
	int s[a] ; 
}
特特殊情况 Class 编译期间需要一个class 常量值

使用enum hack ,一种枚举类型,比较像#define

条款03 -

原因

  • 使用const会告诉编译器和程序员某值应保持不变,如果被修改可以被编译器发现,并且const的应用范围很广,可以修饰i文件函数区块等等
  • 如果关键字const 出现在星号左边,表示被指物是常量;如果出现在星号右边,表示指针自身是常量;如果出现在星号两边,表示被指物和指针两者都是常量。
  • const最具威力的用法是面对函数声明时的应用。在一个函数声明式内,const可以和函数返回值、各参数、函数自身(如果是成员函数)产生关联。
  • 当const和non-const成员函数有着实质等价的实现时,令non-const版本调用const版本可以避免代码重复。

const 成员函数意味着什么

  1. bitwise constness认为不改变任何成员变量才可以说是const
  2. logical constness 一个const成员函数可以修改它所处理的对象内的某些bit,但只有在客户端侦测不出的情况下才可如此。

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

原因 : 读取未初始化的值会导致不明确的行为

1.对于无任何成员的内置类型,必须手工初始化

2. 不要搞混初始化和赋值,构造函数尽量使用初始化列表

因为1.赋值操作会多创建变量
因为2.内置类型不能被赋值,只能被初始化

3. 用local static对象替换non-local static对象来避免跨编译单元之初始化次序”问题

  • local static:函数内的static对象。
  • non-local static:其他static对象。
  • 编译单元:产出单一目标文件的源码(单一源码文件加上include的头文件)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值