1.条款01:视C++语言为一个联邦
C++语言的四大部分主要如下图所示:
这也是对问题C语言和C++语言有什么不同? 的最佳回答之一。
条款02:尽量以const,enume,inline,替换#define
如下的一个定义:
#define RATIO 1.6352
对于预编译的的变量,并不会进入到符号表中,当程序报错时可能对反馈数据1.6352出错,而不是RATIO变量。所以C++语言中用以下语句代替。
const double Ratio = 1.6352;
作为常量,Ratio将会进入符号表,且所有的机器码中出现的也将是Ratio,而不是1.6352;
两种特殊情况:
- 1
定义常量指针时,我们一搬用string对象代替char *;
这样需要两次使用const,且代码的可读性不强,一帮用const char * const Name="Scott";
来代替上述定义。const std::string Name("Scott");
- 2
对于类专属的常量,我们一般将其声明为const常量,为了保证该常量只有一个实体,我们需要将该常量声明为static类。
class A
{
private:
static const int Num=5;
///......
}
有些编译器不能在声明static变量时进行赋值,所以需要在实现文件中定义。
class A
{
private:
static const int Num;
///......
}
//实现文件中初始化
const int A::NUm=;
因为#define没有作用区域,所以不能用#define为类声明专属变量。
enum hack
上述的程序当我们在类外初始化静态成员,但是我们在类的需要用到该数,那么这个时候就会报错。
class A
{
private:
static const int Num;
int arr[Num];//错误,Num没有初始化
}
//实现文件中初始化
const int A::NUm=5;
为了解决上诉的情况,我们可以用enum hack技术,即我们可以用enum类型声明的成员代替int类的常量。
class A
{
private:
enum{ Num=5 };
int arr[Num];
///......
};
用enum hack更能接近#define的功能,因为enum和#define通常都是不能取地址的,这样别人就不能获得专属常量的指针或者引用。而且enum hack是模板编程技术的基础。
用inline代替宏函数
对于宏函数,C语言中用来节省函数调用的开销,但是宏函数的调用容易产生错误。
#define MAX(a,b) (a)>(b)?(a):(b)
即使加上括号,这个宏函数依然是不安全的。
int a=5,b=0;
MAX(++a,b); //a被累加两次
MAX(++a,b+10);//a被累加一次
为了避免宏函数带来的不安全,一般会用inline和模板编程实现上述函数。
template<typename T>
inline int Max(const T& a,const T& b)
{
return a>b?a:b;
}