C++必知必会之(7)常量指针与指向常量的指针

来源:互联网 发布:课观教育 知乎 编辑:程序博客网 时间:2024/05/02 10:18

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++标准告诉我们,这样的赋值会产生未定义的结果。