看了指针和引用,感觉还好,加入了const修饰符后,立马晕头转向,加上各种修饰,完全找不着北。可是多看几遍,掌握命名规则后,忽略一些语言堆砌,完全是666,开挂的节奏啊。

1. 首先看指针和引用
这个基本上很简单,但是确实重点。
其实指针和引用都是对通过它们对其它对象的间接访问。但是二者之间还是有很大的区别的:引用它是对象的别名,要进行初始化,一旦初始化后,将一直绑定那个对象,无法绑定到别的对象,但引用本身不是对象。指针本身就是一个对象,可以为空,也可以随时指向另一个对象。

这里总说的对象在c++ primer里这样解释的:对象是指一块能存储数据并具有某种类型的内存空间。

所以不存在指向引用的指针,但是有对指针的引用,有没有很绕啊,其实很简单的,因为引用不是对象, 而指针必须指向对象(或为nullptr),所以没有指向引用的指针,但是指针本身就是对象,因此有对指针的引用。

2 .再来看const限定符,是对变量类型加以限定,const对象一旦创建后则不能修改,所以要进行初始化。
例如:const int i=10;
          const int j; //没有初始化,错误
这里简单说下对一个对象初始化另一个对象,是不是const都无关紧要

int i =10;
const int ci=i;//ci的常量特性仅在改变ci的值时才会发挥作用,这里初始化仅仅是将i的值拷贝给了ci
int j=ci;//一样的将ci 的值拷贝给了j,拷贝完成后和ci就没有关系了。

3 .加const限定符之后引用和指针变得会复杂很多,但二者之间很类似,先说引用。
引用分为常量引用普通(非常量)引用,二者之间的关系千丝万缕。

<1>首先非常量引用的初始化。

非常量(普通)引用:可以通过改变引用来改变绑定对象的值

const int i=1024;
int &r=i;//错误,因为这里的引用为非常量引用,可以通过r改变i的值,但是这里的i是一个常量,所以错误
int j= 1024; int &r2=j;//正确,可以通过r2改变j的值 r2=100;//这里通过改变r2,改变的实际上是j的值

因此:非常量(普通)的引用只能是非常量对象,不能引用const对象。(严格对应)
<2>再看加了const之后的引用,称为常量引用。
常量引用:不能通过改变引用来修改绑定对象的值,至于它引用的对象是不是一个常量无所谓的,所以对常量引用初始化允许任意表达式作为初始值,只是不能通过改变引用来改变绑定的对象的值。

int i=10const int &r=i;//正确,r绑定对象i,但不允许通过r修改i的值,可以直接改变i的值,i是一个变量
const int j=100;
const int &r2=j;//正确,r2绑定对象j,但不允许通过r2修改j的值,也不能直接改变j的值,j是一个常量

4. 理解了常量引用和非常量引用,指针的初始化也是一样
<1>普通指针:可以通过改变它来改变指向对象的值

int i=10;
int *p=&i;//正确p为一个指向int型的指针
*p=100; //通过改变p改变i的值
const in j=1024;
int *p1=&j; //错误,与引用类似,不能通过p1改变j的值,j为常量

因此:普通指针不能指向常量对象,只能是非常量对象。(严格对应)
<2>指向常量的指针,和常量引用是一样的。
指向常量的指针:没有规定所指的对象必须是一个常量(无所谓),但是要求不能通过该指针改变所指对象的值,(并没有规定那个所指的对象不能通过其他途径改变)。

int i=10const int j=100;
const int *p=&i; //正确,p指向i,但不能通过指针(*p=1024)改变i的值
const int *p1=&j;//正确,p1指向j,j本身就是常量,不能改变其值

所以综上:c++ primer这样总结 :所谓的常量引用和指向常量的指针,不过是他们“自以为是”罢了,他们觉得自己指向了常量(实际上可能不是哦),所以自觉的不去改变所指对象的值。
5 .指针为一个对象,所以允许指针本身定为常量,(但是引用不行哦),称为常量指针。

int &const r2=i;//错误,因为引用本身不能为常量
const int &r=i; //这样才对,为常量引用(是对常量的引用)

常量指针:指不变的是指针本身,并不是所指的那个对象,也就是指针将一直指向那个对象,是可以通过指针修改所指对象的值,因此必须要初始化(开始就要知道所指的对象是谁,不能改变,一直指向那个对象)。 

int i=10;
int * const p=&i; //这里p为一个常量指针,将一直指向i
*p=1024; //可以通过p改变i的值,i的值现在为1024
const int *const p1=&i; //p1为指向常量的常量指针,不仅p1一直将指向i,而且它“自以为是”,自觉的不能改变i的值。

 

posted on 2017-07-18 16:17  liuamin  阅读(303)  评论(0编辑  收藏  举报