这是两个初学者容易混淆的概念。比如,
T *pt = new T;
const T *pct = pt;//指向常量(const T)的指针
T * const cpt = pt;//常量指针,指向T
不过使用一个引用比使用一个常量指针更简单:
const T &rct = *pt; //不用const T* const
T &rt = *pt; //不用T* const
使用过程中,要注意三点:
1. 一个指向常量的指针可以指向一个非常量对象
2. 指向非常量的指针不可以指向常量对象 (行为未定义)
3. 一个常见的误解是,适用于指针的转换同样适用于指向指针的指针。事实上并非如此。
例如,我们知道一个指向派生类的指针可被转换为一个指向其公共基类的指针:
Circle
*
c
=
new
Circle;
Shape * s = c; // 正确
Shape * s = c; // 正确
因为Circle 是一个( is-a ) Shape ,因而一个指向 Circle 的指针也是一个 Shape 指针。
然而,一个指向 Circle 指针的指针并不是一个指向 Shape 指针的指针:
Circle
**
cc
=
&
c;
Shape ** s = cc; // 错误!
Shape ** s = cc; // 错误!
这里两种可以这样理解:
typedef Circle * LPCircle;
typedef Shape * LP Shape;
LPCircle * cc = & c;
LP Shape * s = cc;//错误, LP Shape和 LPCircle没有 is-a的关系