关于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,可使其变为类型声明。