目录
前言
本博文又名const T vs. T const ——Dan Saks 读后感,链接见文末
const位置解读
const T p;//p is a T const.p为只读,地址不能变,存储内容不能变
T const *p;//p is a point to T const.p是一个指向T类型的指针,地址能改变,地址内的存储内容不能变
const T *p;//同2
T *const p;//p is a const point to T,p是一个指向T类型的指针,地址不能变,地址内的存储内容能变
const T *const p;//p is a const point to T cosnt //p是一个指向T类型的指针,地址不能变,地址内的存储内容也不能变
T const *const p;//同5
比较好的习惯
在C和C++中的每个声明都有两个主要部分:零个或者更多声明说明符,和一个以上用逗号隔开的声明符
例如:
static unsigned long int *x[N];
static unsigned long int//声明说明符
*x[N]//声明符
一个声明符就是被声明的名称,可能伴有操作符,比如*,[],(),和(C++中的&。正如你所知的,声明中的符号*表示“指针”,[]表示“序列”因此,*x[N]表明x是个“有N个指针元素的序列,分别指向某某”,某某就是声明中指定的类型。例如:
static unsigned long int *x[N];//把x声明为“指向unsigned long int 的N个指针元素的序列”的一个对象。
为什么我知道*x[N]是一个指针的序列,而不是指向一个序列的指针?它遵循以下规则:
在一个表达式中,声明符中的操作根据他们的优先级来分组
例如,在C和C++中,如果检查最近优先级图标,你会发现[]的优先级比更高。因此声明符X[N]表明x是一个优先于指针的序列。原括号在声明符中有两个作用:第一,作为函数调用的操作符,第二,用来分组。作为函数调用的操作符,()和[]的优先级相同。用作分组时,()的优先级最高的。
另外有个重要观点:
声明说明符在一个声明中出现的顺序并不重要
声明说明符const和volatile不寻常,因为:
能出现在声明符中的声明说明符只有const和volatie
所以:
void *const vectorTable[]//可以
*const void vectorTable[]//是错误的
下面的声明是等同的:
const void *vectorTable[]//大多数C和C++程序员喜欢把const和volatile写在其他类型的说明符的左边
void const *vectorTable[]//我更喜欢把const和volatile写在右边,并且强烈推荐这么写。
const用法详解
C++基本上是按从头到尾,从左到右的顺序来读,但是指针的声明,从某种意义来讲却是倒着的。指针的声明是从右到左来看。
把const放在其他类型说明符的右边,可以严格的从右到左来看指针说明,还可以把const从“右边的”位置提出来,如:
T const *p;//把p声明为“指向const T的指针”,非常准确
T *const p;//把p声明为指向T的const指针“也能正确理解
参考资料
const T vs. T const ——Dan Saks 【翻译】
const T vs. T const ——Dan Saks
const指针和指向常量的指针