1、T *pt = new T; //一个指向T的指针
const T *pct = pt; //一个指向const T的指针
T *const cpt = pt; //一个const指针,指向T
在pct的声明中,指针不是const的,但它所指向的对象被认为是const的。换句话说,const修饰符修饰的是基础类型T而不是指针修饰符*。而对于cpt的声明来说,声明的是一个指向一个非常量对象的常量指针,即const修饰符修饰的是指针修饰符*而不是基础类型T。
2、const T *p1;
T const *p2; //两者是一样的,都是一个指向常量T的指针。(倒过来读指向常量T的指针)
T const *p3; //一个指向常量的指针
T *const p4 = pt; //一个常量指针,指向非常量T
3、当然,可以声明一个指向常量的常量指针:
const T *const cpct1 = pt; //二者均为常量
T const * const cpct2 = cpct1; //同上
4、注意,使用一个引用通常比使用一个常量指针简单:
const T &rct = *pt; //而不是const T *const
T &rt = *pt; //而不是T *const
5、实际上,指向常量的指针(或引用)去指向非常量的对象,是很常见的:
void aFunc( const T *arg1, const T &argv2 );
//....
T *a = new T;
T b;
aFunc(a, b);
我们并没有宣传a要指向一个常量对象,或者b是一个常量引用。只是声明在aFunc函数中将它们视为常量,而不管它们实际上是否如此。
6、但是,相反的转换,即从指向常量的指针转换为指向非常量的指针,是非法的。
const T acT;
pct = &acT;
pt = pct; //报错
*pt = aT; //试图修改常量对象
C++标准告诉我们,这样的赋值会产生未定义的结果。