条款1:将c++看做是在C的基础上添加了类的特性,再添加了泛型编程和STL库的集合。
条款2:少使用#define,换之以const,enum和inline关键字
1>当想用#define定义一个变量时,可以考虑用const代替
2>当想用#define实现一个函数的功能时,可以考虑将函数在头文件中实现,并加上(或不加)inline关键字,即让函数成为内敛函数,减少了函数调用上的时间开销,在所有使用该函数的地方,都是采用代码块移植的方法进行函数调用,即用空间换时间
3>当你想在类中定义一个数组并指定数组大小时,当你的编译器不允许在class中将static的变量进行初始化时,可以考虑采用enum hack的方式,即在class中定义一个枚举,并指定大小,然后再定义数组时,指定数组大小为枚举值,如
class A {
private:
enum {Num = 4};
int arr[Num];
};
注意:
为了表示变量的只读性,通常会将变量定义成const,为了限制变量的使用范围,可以考虑将变量值包含在class中,同时为了确保所有的类实例只有一份数据,会将此数据定义成static,定义成static的变量通常是在类外或.cpp文件中初始化,即
class A {
private:
static const int myNum;
};
const int A::myNum = 1;
条款3:多使用const
1>识别到底谁是常量。
当const在*(星号)的左边时,表示指针所指的对象是常量,即指针指向的内容不可修改;
int a=10;
const int *p=&a;
*p=20;(错误)
当const在*右边时,表示指针本身是常量,即指针地址不可修改,即当前指针不可以指向其他地方;
int b=20;
p=&b;(错误)
当const在*左侧和右侧都存在时,表示两者都是常量,不可修改。
*p=20;(错误)
p=&b;(错误)
2>函数返回值为什么要声明为const?
将函数返回值声明为const,可以避免不必要的错误(进行操作符的检查)
class A{};
const A operator* (const A& lfs, const A& rfs);
A a,b,c;
(a*b) = c;//在a*b的结果上调用operator=
此时const的作用就发挥出来了,因为a*b的结果是const A类型的,所以a*b的结果不可以修改,此时就无法将c赋值成功,避免了无意义的赋值动作
3>函数参数什么时候需要加const?
很简单的判断,一般情况下,都声明为const,除非你想要修改他
4>const成员函数和非const成员函数
const成员函数承诺不改变对象的逻辑状态,如果在const函数内调用了非const函数,对象有可能被改变,是一种错误的行为;而non-const函数可以做任何行为,所以自然就可以调用const函数
条款4:在定义类的同时,构造函数采用初始化列表的形式完成对象的初始化