关于const

const变量默认时是定义该变量的文件的局部变量,这样设置默认情况的原因在于允许const变量定义在头文件中。如果const变量不是用常量表达式(编译器在编译时能够计算出结果的表达式)初始化,那么它就不应该在头文件中定义。如果const变量需要被多个文件共享,应该在头文件中为它添加extern声明。

不能用const对象初始化非const对象,但允许(已经过初始化了的)非const对象初始化const对象。这是因为const限制了对象的自由度(不能改变值)。而在赋值操作中,左值优先级更高,即右值向左值看齐。一个低自由度(const,enum)对象是无法满足一个高自由度(非const)对象的需求的

关于typedef

先看几个例子:

int ia[3][4];
int (*ip)[4] = ia;
等价于
typedef int int_array[4];
int_array *ip = ia;
bool (*pf) (const string &, const string &);
等价于
typedef bool (*cmpFun) (const string &, const string &);
cmpFun pf;
void (*signal (int signo, void (*func) (int))) (int)
等价于
typedef void Sigfunc(int);
Sigfunc *signal(int, Sigfunc *);
/*摘自apue,这个例子的返回值是一个函数指针(自内往外看,被指向的函数包含一个int参数且返回值为空)*/

如何理解typedef呢? typedef int wage;这样理解:int wage; wage是一个int型的变量,但是typedef定义它为int型本身。复杂一点的也可以这样理解:

1.先不看typedef,这时我们看到的是一个变量的声明。

2.再看typedef,这个变量是第一步中我们看到的其自身类型的本身。

例如,看上表最左边单元格:int int_array[4];首先,不看typedef,我们看到int_array是一个指向包含有四个整数数组的指针型变量;接着看typedef,int_array就是定义了这样一种指针类型(它指向一个包含有四个整数的数组)

小结:在一个变量声明加上typedef,可使其变为类型声明。