今天看了C++Primer的2.5.1的一点小理解。
如果某个类型的别名指代的是复合类型或是常量,那么它用到声明语句里面就会产生意想不到的后果,例如下面的声明语句用到了类型pstring,它实际上是类型char*的别名:
typedef char* pstring; const pstring cstr = 0; //cstr是指向char的常量指针 const pstring* ps; //ps是一个指针,指向char的常量指针。
上述两条声明语句的基本数据类型都是const pstring,和过去一样,const是对给指定类型修饰,pstring实际上是指向char的指针,因此,const pstring就是指向char的常量指针,而非指向常量字符的指针。
遇到了一条使用了类型别名的声明语句时,人们往往会错误地尝试将类型别名替换为本来的样子,以理解这条语句的含义:
const char* cstr = 0; //对const pstring cstr的错误理解
在强调一遍:这种理解是错误的。声明语句用到的pstring时,其基本数据类型是指针。可使用char*重写了声明语句后,数据类型变为char, *成为声明的一部分。这样写的结果是,const char成立基本数据类型,前后两种声明截然不同,前者声明了一个指向char的常量指针,改写后的形式声明了一个指向const char的指针。
上面书上的原话,下面是我的理解,如有不正确之处,还请您指出,先在此谢谢了:
const pstring cstr = 0; //这里的const是修饰cstr的类型,而cstr的类型是const pstring,所以理解cstr是指向char常量指针
const pstring* ps; //这里的const是修饰*ps的类型,但*ps的类型是const pstring,以理解为ps是一个指针,指向char的常量指针
const char* cstr = 0; //这句的理解在这句话下面黑体部分解释的很清楚了吧,我就不废话了
总结起来就一句,const修饰定义的变量的类型,*ps本身就是一个指针,再加上const pstring,所以const pstring* ps这句才会是ps是一个指针,它的对象指向char的常量指针。