让自己习惯C++
条款1:视C++为一个语言联邦
C++可以看作是四种次语言组成的:
C(包括区块、语句、预处理器、内置数据类型、数组、指针等);
Object-Oriented C++(主要表现C++的面对对象的性质,包括类、封装、继承、多态性、virtual函数等);
Template C++(为C++泛型编程部分);
STL(是模版程序库,主要包括容器、迭代器、算法以及函数对象)。
条款2:尽量以const, enum, inline替换 #define(实用编译器代替预编译器)
问题:#define定义的宏不被视为语言的一部分,而其定义的记号名称也许没有进入记号表被编译器看到,追踪宏定义较麻烦。
解决方案:以常量替换#define(使用const关键字)
const double* cptr;//指向const对象的指针,不能通过该指针改变所指向地址的值,但可以改变指针所指的地址值,定义时不用初始化
double* const cptr;//const指针,指针的值无法改变,定义时必须初始化。
在实际程序中指向const的指针常用作函数的形参,可用于防止函数对形参进行修改。
特殊情况:1、在头文件中定义指向const char*(c风格字符串)的常量指针时应写两次const(此时用String更合适)
const char* const anthorName="Scott Meyer";
const std::string authorName("Scott Meyer");
2、定义类内专属常量时为保证只有一份实体需定义为static成员(此时体现了#define不具有封装性)
如果在class编译期间需要给class专属的常量值赋初值,但是旧式编译器不允许class成员在其声明式上获得初值,此时应采用“the enum hack”做法。其理论基础为:一个属于枚举类型的数可以权充int被使用。
static const int NumTurns = 5;
int score[NumTurns];
enum{NumTurns=5};
int score[NumTurns];
"enum hack"的优点在于其行为在某些方面比const像#define。我们无法获得enum和#define的地址,但是我们可以获得const的地址。enum可以实现这种约束。
对于形似函数的宏,最好改用inline函数代替#define。