C++中const与引用,指针之间的关系要点

一、const关键字
1、有时我们希望定义这样的一个变量,它的值不能被改变。这时就可以在定义变量时加上const关键字。例如

const int bufSize=512;

const类型变量可以进行大部分与非const类型变量相同操作,主要的限制就是不可以在const类型的对象上执行任何改变其内容的操作。(因为const类型对象一旦创建后其值就不可以再改变,所以必须初始化,关于不同情况下的初始化下面会详细说明)
2、默认情况下,const对象只在定义它的文件内有效,要是想在其他文件中也可以使用,那么对于const变量不管是声明还是定义都应该加上extern关键字。

extern const int bufSize=512;

以后编译器会找到代码中所有用到bufSize的地方,并把它替换成512。所以const关键字类似于C语言里的宏定义的功能。

二、单纯const对象的初始化
1、

int i=42;
const int c=i; //可以用非const对象给const对象初始化 

2、

const int c=10;
int j=c;    //可以用const对象给非const变量初始化

总结就是如果用一个对象去初始化另一个对象的时候,是不是const对象都无关紧要。

三、const的引用
1、当把const和引用绑定在一起的时候,称作是对常量的引用(常量引用),对常量的引用不可以修改他所绑定的对象,如下例:

const int c=1024;
const int &r=c;
r=1000;   //错误,因为此时r是c的引用(也就是c的别名,因为是常量引用,所以不可以通过r来改变c的值,但是c的值本身是否可以通过别的方式来改变要看C本身,这里C是常量,所以也不可以通过别的方式来改变)

2、关于“对常量的引用”的初始化
(1)在初始化常量引用时允许使用任意类型表达式作为初始值,只要该表达式最终可以转换成引用的类型即可。例如:

int i=42;
const int &r1=i;
const int &r2=42;
const int &r3=r1*2;
//上诉代码都是正确的(注意:此时不可以通过r1,r2,r3来改变所引用对象得值,但是由于i非常量,所以i的值可以任意被改变)

(2)在引用一个常量的时候必须是常量引用,不可以是一般的普通引用。例如:

const int i=42;
const int &r1=i;   //正确(注意此时既不可以通过r1来改变i的值,这点与(1)情况一样,也不可以通过其他方式改变i的值,因为i是常量)
int &r2=i;        //错误

总结
就是对一个常量引用进行初始化可以任意类型表达式(const非const都可以),此时不可以通过引用来改变他所绑定的对象,但是被绑定的对象可不可以通过其他方式来进行改变则需要看被绑定的对象自身,如果自身是const类型,则不可以;如果自身不是const类型,则可以通过其他方式来改变。
对常量(const对象)进行引用则必须是常量引用。且不可以通过引用来改变被绑定对象的值,同样被绑定的对象的值也不可以通过其他方式来改变。

四、指针和const
1、int const *p与const int * p等价(只要const在 * 左面)就叫做指向常量的指针。
指向常量的指针和常量引用类似。指向常量的指针的初始化可以是任意类型的对象(可以指向任意类型的对象),但是不可以通过指针来改变所指向对象的值,被指向的对象的值可不可以通过其他方式被改变,要看被指向的对象本身。例如:

double p=3.14;
const double pi=3.14;
const double *ptr=&p;  //正确,可以用指向常量的指针指向一个非const变量,(但是此时不可以用*ptr的方式改变p的值,但是p的值可以通过其他方式来改变)
const double *ptr=π//正确,可以用指向常量的指针指向一个const变量,(此时既不可以用*ptr的方式来改变pi的值,也不可以用其他方式来改变pi的值,因为pi是const常量)
double *pt=π//不可以,因为要想存放常量对象的地址,只可以是指向常量的指针。

注意:指向常量的指针虽然不可以改变其指向对象的值,但是却可以改变指针的指向,即在指针存在范围内,可以指向多个不同的对象。(这一点与下面要说的常量指针不同)
2、常量指针
(1)所谓常量指针就是把指针变成常量,不可以改变(既常量指针初始化后,他的指向就不可以变)常量指针必须初始化。把*号放在const前面就意味着这个指针是常量。如下:

int a=0int *const p=&a;//正确,此时可以利用*p来改变a的值,但是p将一直指向a,不可以指向其他。
const int b=1;
int *const q=&b;//不可以,因为b是常量,所以必须要用指向常量的指针(即const在*前面)来指向b,具体见下面
const int * const q=&b;//正确。q是一个指向常量对象的指针常量。(小技巧:分析一个变量类型时,从右往左读,越靠近变量的越能决定一个变量的性质。最靠近的是q的是const,说明q是一个常量,又是*说明是一个常量指针,然后是int,说明这个指针指向一个int型变量,然后是const,说明这是一个指向常量对象的常量指针)在这里,不可以用*p改变b的值,p也不可以指向其他的对象,b也不可以通过其他方式改变值。

总结常量指针初始化后不可以指向别的对象,但是是否可以通过常量指针来改变对象的值要看被指向的对象是否是常量。

猜你喜欢

转载自blog.csdn.net/weixin_43444439/article/details/83275252
今日推荐