Fork me on GitHub

Gotchas 31-对目标类型为指涉物为常量的指针类型的类型转换的认识误区

首先要理清几个术语:常量指针(const pointer)和指向产量的指针:

常量指针(const pointer)是指一个拥有常量值得指针,其中并不包含“其指涉物是否为常量”的任何暗示。
const char *pci;//指向常量的指针
char *const cpi=0;//常量指针
char const *pci2;//仍然是指向常量的指针
const char * const cpci=0;//指向常量的常量指针。
char *ip;//普通的指针

“C++标准规定允许进行‘增加常量性’的(无条件)类型转换”。举例来说,我们可以把一个指向非常量的指针复制到一个指向常量的指针。这样我们就可以——当然也可以做许多其他的事情——把一个指向char类型的非常量指针传递给标准库中的strcmp或strlen函数,尽管他们声明只接受指向char类型常量的指针,直觉上我们能够理解为什么可以这么做:允许指向常量的去指向非常量的(但本身不失其指涉物常量性),因为我们没有因此丧失任何数据声明时的约束,当然我们也能理解为什么逆向的转换被封印,因为这么一来我们就获取到了数据被声明时更多的权限;
size_t strlen(const char *);
//...
int i=strlen(cpi);//没问题参数传递
pci=ip;//也没问题指针赋值
ip=pci;//错误
请注意C++语言规范在数据常量性问题上采取一种保守的观点:其实这么说也可以——在不立即引起核心转储的前提下——我们可以修改指向常量指针所涉的数据,只要这些数据实际上(在未被指涉的语义中)并非常量①,或他们却是常量,但是运行该代码的平台并不把数据分配到内存储器的只读区域。总之常量性的典型用途是在设计期的一种立场表达,同时也是一种系统属性标示。C++语言看来会强制推行设计者的意图。
=============================================================
注释:
①译注:也就是说让一个声明为指向常量的指针指向一个本身不是常量的数据,那么就不能通过这个指向常量的指针来修改这个数据了,但是并不是说明这个数据不能修改。→参见常见错误6.

posted @ 2012-09-30 17:13  zhanjindong  阅读(467)  评论(0编辑  收藏  举报
TOP