全部博文(47)
2013年(47)
分类: C/C++
2013-06-19 17:36:26
对于一个指向const对象的指针pointer to const T,由于把const视作常量表达式,常常存在如下两种观点:
1。这是一个指向常量的指针,简称常量指针;
2。这个指针指向的内容不可改变。
这是比较粗糙的理解。虽然这个指针的类型是pointer to const T,但不代表它指向的对象真的是一个常量或者不可改变,例如:
int i = 10;
const int *p = &i;
i = 20;
p指向的对象i明显不是常量,虽然p指向i,但i的值依然可以改变。对于这个现象,C++标准有明确的论述:
7.1.5.1 The cv-qualifiers
a pointer or reference to a cv-qualified type need not actually point or refer to a cv-qualified object, but it is treated as if it does;
其中cv指的是const和volatile,const和volatile叫type qualifier,类型限定词。const T只是类型假定,并非指出该对象是什么,这个对象也许是const限定的,也许不是。既然上述两种看法都是不恰当的,pointer to const T又应如何看待呢?一种比较好的理解是,将其视作一条访问路径。对一个对象进行取值或者修改操作,可以有很多种方法,每种方法都相当于一条能够对对象进行访问的路径,例如:
int i = 10, k;
const int *p = &i;
int *q = &i;
i = 20;
*q = 30;
k = *p;
通过*q、*p和标识符i都能访问i所代表的整数对象,它们可以视作三条路径,i和*q能够修改该整数对象的值,这两条路径是可写可读的;但*p不能写,因为p指向的对象被假定为const,从p的角度看来,*p是只读的,不能通过p修改它指向的对象。因此,一个pointer to const T指针的确切意义,不是指向常量或者指向的对象不可改变,而是指不能通过这个指针去修改其指向的对象,无论这个对象是否const,它只指出一条到该对象的只读路径,但存在其它路径可以修改该对象。