C++中const限定符与指针

来源:互联网 发布:直男癌语录 知乎 编辑:程序博客网 时间:2024/06/06 20:35

最近在看《C++ Primer》,看到const限定符与指针的关系之时,感觉绕的云里雾里。细细体味之后,感觉到了其中的奥秘,于是写了一份学习心得,供大家学习时参考~共同学习,共同进步呐~

const与指针之间的交互过程分为两部分:1. 指向const对象的指针;2. const指针。所以“const指针”这个名字不是能乱叫的,不能作为const与指针使用时的统称。


1. 指向const对象的指针

如果指针指向的对象时const类型的,此对象不能被修改。但是,如果通过指针指向此对象修改行不行呢?是可以的。所以C++是不会让他得逞的,于是C++强制要求指向const对象的指针也要有const特性。注意此时const写在原来指针的类型之前,作用是“不能用此指针改变指向对象的值”例如:

const double pi = 3.14 ;const double *p = &pi ;

从此,你就再也不能通过指针p指向pi的内容,从而来修改pi的内容。

但是,如果一个不是指向const类型对象的指针,能不能使用const来限定呢?答案是可以的。因为这里的const限定是一种“自以为指向const的指针”,异常傲娇……它是一厢情愿的认为:我限定的指针就是指向const对象的!!!同时,此指针本身的值可以改变(指针本身可以改变赋值)例如:

double dval = 3.14 ;p = &dval ;

这种限定是正确的,但是dval是可以改变值的,p的值也是可以改变的。但是如果使用p指针指向,指向dval值之后进行改变,这样就不允许了。因为p站在自己的角度上,还是固执地认为“自以为”dval是const对象。

实际程序中,指向const的指针常用作函数的形参。将形参定义为指向const的指针,以此确保传递给函数的实际对象在函数中不因为形参而被修改。

注意:号称能声明任务对象的void(见本书 chapter 4.2.2)在此处也要吃瘪。不能用void*指针,只能使用const void*类型指针保存const对象的地址。


2. const指针

上一种使用的方法目的是使得“指向的目标对象不被修改”,但是指针本身是可以更改值的。但是C++还提供另外一种const指针,指针本身的值不能修改。即const指针:

int num = 0 ;int *const cur = &num ;

此时写const的位置挪到了原指针的星号之后了。此时这个指针变成了自身不能改变值的const指针。而且这种const指针必须在定义时初始化。初始化之后不允许赋值,甚至不允许赋回以前的值。;例如如下错误:

cur = cur ;

真是丧心病狂……总是这种const指针你就只拿来用就别改了。但是指针本身不能修改,这种指针指向的对象还是可以修改的,而且可以通过这个指针进行修改。

*cur = 1 ;

以上语句是可以通过的。总之,const指针是一个严于律己宽以待人的指针,只管自己不能改,指向的对象可以改,而且还能通过自己改。


3. 指向const对象的const指针

综合以上两种类型,于是我们可以得到指向const对象的const指针:

const double pi = 3.14 ;const double *const p = &pi ;

这种书写比较操蛋……读起来需要从右向左,也就是:p是一个const指针,也就是说p不能再指向别的值;咦!p指向的对象还是个const对象呐么么哒,于是想用p指针对此对象进行改变赋值的行为也可以滚粗呐~


4. 指针和typedef

以上这些东西绕来绕去的很麻烦,于是大家可以巧妙使用下typedef类型来简化操作。但是大家记得一件事:typedef不是简单的英文缩写,所以:

typedef string *pstring ;const pstring p ;

其实,p不想再隐瞒了,它是真实身份是 string *const p,绝对不是什么 const string *p,大家只要记清楚这一点就好呐~


今天的问题就讲到这里了,大家有问题欢迎交流~

原创粉丝点击