Chinaunix首页 | 论坛 | 博客
  • 博客访问: 144182
  • 博文数量: 47
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 402
  • 用 户 组: 普通用户
  • 注册时间: 2013-03-11 10:08
文章存档

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指的是constvolatileconstvolatiletype 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,它只指出一条到该对象的只读路径,但存在其它路径可以修改该对象。

阅读(941) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~