C++ const相关(引用、指针、顶层底层const)

一、const的基本定义

对于变量的定义和声明我们已经非常熟悉了,与之相对应,加了const的变量就是一个常量,跟C语言里面的#define是一样的。

由于const对象的值不允许被改变,因此const对象必须初始化,否则系统会报错。

跟普通变量一样,const对象也只在一个文件中有效,要想可以被多个文件访问需要加上个extern。这其实跟头文件的使用是一个道理,在头文件中声明,在cpp文件中定义。

二、const的引用

与其说叫const的引用,不如叫引用const类型的对象更为合适。

非常量引用不能绑定const对象,但是常量引用可以绑定非常量对象。有点懵了吧,看代码。

const int i = 1;
const int &r1 = i; //正确
int &r2 = i;       //错误,非常量引用不能绑定常量

int j = 2;
const int &r3 = j; //正确,常量引用可以绑定非常量

其中,不能通过r1改变i的值很好理解,因为i是常量。但是,下面j虽然是个变量,但是不能通过r3来改变j的值。

可以这么理解,r3是一个对常量的引用,即便你给他绑定了一个变量,它也以为自己绑定了一个常量,所以不能通过它改变引用对象的值。

三、const与指针

const和指针之间的关系要比引用复杂一些,因为引用是不允许改变引用对象的,但是指针可以改变所指对象,这就又牵扯出很多幺蛾子。

与引用类似,指针也可以分为指向常量和非常量两种。指向常量的指针(pointer to const)不能用来改变所指对象的值。

指向常量的指针既可以指常量也可以指变量,但是普通指针只能指变量不能指常量。

const int i = 1;
int *pi1 = &i;        //错误,pi1是普通指针
const int *pi2 = &i;  //正确,pi2可以改变所指对象
const int *const pi3 = &i;  //正确,pi3不能改变所指对象

四、顶层const和底层const

记住一点,只有指针类型才会同时出现顶层和底层两种const,其余的都只有一种。

那么如何区分两种const呢?很简单,看一条语句左侧这个对象,它本身是否能改变。它本身不能改变,就是顶层const;如果是他所指的对象不能改变,那就是底层const。

举个例子:

int i = 0;
const int j = 1; //这里j不能被改变,它是顶层const
const int *p1 = &j; /* p1本身可以改变,也就是p1可以指向别的常量,
                       但是p1所指的对象j不能被改变。所以这是一个底层const*/
int *const p2 = &i; //p2本身不能改变,是顶层const
const int *const p3 = &j; //p3本身和所指对象j都不能被改编,它既是顶层const又是底层const

除此之外,根据上面讲的引用const的特性,一个const引用不管给它绑定一个变量还是一个常量,都不能用它来改变引用对象的值,因此所有的const引用都是底层const。再加上引用不允许改变引用对象的性质,所以引用就没有顶层const这一说。

猜你喜欢

转载自blog.csdn.net/weixin_43390123/article/details/114478183
今日推荐