typedef
可以定义一个类型的别名,一般常用的操作是定义一个结构体的别名,当然常用类型也可以,也可以加入指针:
1 | typedef int* Fuck; |
当typedef
加入指针后,可能就比较难理解。诀窍是《C++ primer》中反复强调的:
从右往左看
首先看上面代码,定义了别名Fuck
为int指针这种类型。
然后变量p1的类型自然是int指针。
而p2,首先从右开始,它是一个Fuck
类型,然后被修饰了const
,所以它是一个Fuck
类型的常量。这时候再把别名Fuck
换回原来的类型,则可知p2是一个类型为int指针的常量,即常量指针,是一个顶层const。
而p3,从右开始,它首先是一个指针,然后是一个Fuck
的指针,然后被修饰了const
,所以是一个指向常量Fuck
的指针。这里再换回原来的类型,可知p3是一个指向了常量int指针的指针,是一个底层const。
其实疑惑的点在于*
这个指针的修饰符,到底跟谁捆绑在一起。有的人可能会把p2直接改写为:
1 | const int* p2 = 0; |
如果这样的话,其实*
是优先跟p2捆在一起的,加上括号的话就比较好理解,即:
1 | const int (*p2) = 0; |
也就是说,如果按照这种改写方式,其实我们定义p2是一个指向int常量的指针,是一个底层const。
而通过typedef
定义的指针别名,加上括号来替换比较好理解,即:
1 | const (int*) p2 = 0; |
这样就能理解p2是一个int指针的常量。
评论