C++中const的含义

来源:互联网 发布:淘宝手机详情动态图 编辑:程序博客网 时间:2024/06/08 15:27

在学习c++期间,一次偶然看到一篇文章,文提到一个问题:关键字const是什么含意?然后作者接下来又说到,如果对方回答说:“const意味着常数”,就知道正在和一个业余者打交道。这话使我震惊了,然后继续把文章看完了,并按文章所说的,下载了Dan 

Saks的const T vs. T const文章,并仔细看了一遍。现记录一下自己的理解。

在说明问题之前,先来看一个小例子:

typedef void *VP;

const VP vectorTable[] = {...<data>..};

跟上面这段代码等价的是不是下面这段代码呢?

const void *vectorTable[]={..<data>..};

其实不然,真正跟它等价的应该是:

void *const vectorTable[]={..<data>..};

vectorTable的含义是一个数组,包含的元素为常量的void指针。

 

解释这个问题之前,我们来看一下声明语句的结构:

static unsigned long int *x[N];

斜体的为声明说明符,而粗体的声明符。每一个C、c++语言的声明都包括两部分,0个或多个声明说明符,一个或多个声明符,

声明符由逗号分开。声明符是被声明的名字,被一些操作符,如*,[],()和&所包围。这些操作符的优先级跟它们在表达式中的优先级是

一样的。括号在声明语句中可以担任两个角色,一个是函数调用操作符,一个是组合。作为函数调用操作符时,优先级和下标操作符[]

一样,作为组合时,有最高的优先级。例如:*f(int)声明f是函数,返回一个指针;而(*f)(int)则表明f是一个函数指针。声明符可以包

含多个操作符,如*x[N],也可不包含操作符,如声明语句:int n;。

声明说明符其实是类型说明符,如int,unsigned,存储类说明符如static或extern,inline和virtual。类型说明符用来说明声

明的变量的类型的,其它的说明符并不提供类型信息。const和volatile是类型说明符。声明语句中的声明说明符的顺序并没有要求。

能出在声明符中的声明说明符仅为const和volatile。如:void *const vectorTable[];出在声明符中,顺序就不能再变化:

如*const void vectorTable[]就是错误的。

因为声明说明符的出现顺序并没有限制,因此推荐将const放在右边:如T const *p; p是一个指向常量类型T的指针,

T *const P,p是一个常量指针,指向T类型。这样有利于正确理解语句的意思。尽管C和C++的解析大部分都是自顶向下和从左到右的,

但对于声明语句,从某种意义上来说,是从后面开始的,也就是从右向左的。在对待声明说明符和声明符时,也应该了解它们的界限,如

语句:const int* P;最好写成:const int *p;这样更一目了然,而且不易出错。