条款1:视C++为一个语言联邦
C是面向过程的语言,侧重点在于算法和数据结构。
C++是面向对象的语言,侧重点在于抽象出对象模型,使模型和问题契合。
区别:
Class:C++中的类是C没有的,但是C中Struct在C++中也可使用;Struct成员默认访问修饰符是public,而Class默认的是Private。
动态管理内存:C使用malloc/free函数,而C++除此之外还有new/delete关键字。
Overload、Template:C中没有重载和模板。
C++四个层次:
1、C:内置数据类型 pass-by-value比 pass-by-reference 更合适。
2、Objec-Oriented C++:面向对象。构造函数和析构函数。pass-by-reference-const 更合适。
3、Template C++:泛型编程
4、STL:是template程序库,它对容器、迭代器、算法和函数对象有紧密配合和协调。pass-by-value
条款2:尽量以const,enum,inline替换#define
总结:
1、常量,最好以const对象或enum替换#define。
2、简单函数,用inline函数替换#define。
一、宏的弊端
编译器对宏的处理是在预处理阶段进行的,处理方式的核心思想是:简单替换。
(1)简单的宏定义:
- 无参 #define <宏名> <字符串> 例: #define PI 3.1415926
- 带参 #define <宏名> (<参数表>) <宏体> 例:#define MAX(a, b) ((a)>(b) ? (a) : (b))
(2)无法进入编译器
使用预处理定义了圆周率
#define PI 3.1415926
在预处理时, 所有使用PI的地方都将被替换,之后编译器在编译时从未看到过PI。这时如果遇到错误,报错时给出的是301415926,而不是PI,因为PI从未进入到符号表,这将导致错误难以理解。
二、const
上述问题一种解决办法是使用常量替换宏
const double PI=3.1415926
常量const替换#define时,有两点要注意:
1、替换字符串时,要定义成常量指针(指向常量的指针、底层指针)
#define name "xiaoming"
const string name="xiaoming"
2、 专属于class作用域的常量,而#define不重视作用域。<