您的位置 首页 嵌入式

C++中const与指针、引证的剖析

C++中函数的参数相比C语言中的函数参数要复杂的多,其中主要的原因是C++中引入了引用以及const限定符。这两个对象的引入,使得C++中的函数

C++中函数的参数比较C语言中的函数参数要杂乱的多,其间首要的原因是C++中引进了引证以及const限制符。这两个目标的引进,使得C++中的函数参数变得反常的杂乱多变,每一种类型都具有比较合适的使用范围。

本文详细的剖析const与指针、引证在一起存在状况下的状况剖析。

首要介绍引证
引证是目标的别号,必须在初始化的进程中与一个详细的目标绑定起来,绑定完结今后就再也不能够修正了,引证形似和指针有很大的相似性,可是引证是引证,是一个别号,而指针是一个变量,仅仅变量中保存的是目标的地址,引证并不分配新的内存空间。因而一个引证与一块内存区域绑定,是这块内存区域的别号,就好像数组名相同,数组是内存中的一块区域,数组名是这块区域的姓名,可是在内存中并不存在额定的区域保存数组名。引证便是一块内存区域的别号。C++中变量实质上便是一块内存区域,咱们在用&i就能够得到变量i的地址,也便是说变量是这块区域的姓名。对变量的操作实质上便是对这块内存中内容的操作。别号是这块区域的另一个姓名。选用任何一个姓名对这块区域修正都会影响区域的内容。

int vari = 10;
int &refr = vari;
vari = 20;
cout << refr << " " << vari << endl;
refr = 30;
cout << refr << " " << vari << endl;

上面的int &refr = vari实质上便是变量vari的别号,也便是保存vari变量地址的别号,这个地址中保存的是一个int类型的数据,数据能够经过vari来操作,能够修正。由于refr是一个别号,也能够经过该别号对这块内存区域进行操作。也便是说别号的操作便是针对一块特定的内存区域,这个经过变量操作的作用是共同的。
其次说说const限制符
const的引进使得在函数操作中的一些问题杂乱了,可是愈加的合理了,const限制符是指上是指一个常量。这个常量在一般的状况下便是限制变量不能修正,可是当这个限制符与引证、指针结合在一起时,使得许多的问题不在明亮。

1、const与指针

int *ptr;
const int *ciptr;
int const *icptr;
int * const cptr;
const int * const cicptr;

上面是关于const与指针结合时的各种状况,这并不仅仅C++中常常遇到的问题,在C语言中也会有相似的评论,尽管const并不是C语言中的关键字。
int * ptr 是指界说一个指向int 类型的指针ptr。
const int *ciptr 是指界说一个指向const int 类型的指针ciptr,这是const 限制的是(* ciptr),也便是对指针解引证,即const限制的便是数据自身,而非指针。所以ciptr是一个指向常int型数据的指针。
int const * icptr其实和上面的const int *ciptr是共同的由于const仅仅一个限制符,在int前仍是后都 没有影响,他限制的仍然是(*icptr),并不是icptr,也便是icptr也是指向常int型数据的指针,也便是说在icptr这个指针看来,它指向的数据是常数,是不能改动的,可是是否真的不能改动,需求根据实践的类型的剖析,仅仅不能经过这个指针来改动。也便是说该指针是一个自以为自己指向常量的指针。
int * const cptr 这时候咱们仍是结合const的方位剖析,const限制的是cptr,cptr咱们能够知道是一个指针,也便是说const限制的是一个指针,而不是指针指向的数据,也便是说这种界说实质上是界说一个常指针,也便是指针指向的地址是不变的,也便是cptr是不能被赋值的,不能选用这个指针指向其他的目标或许地址。可是这个地址中的数据并不是常数,是能够改动的,能够经过对*cptr进行修正。这种指针实质上也就使得指针的作用大大减小,并不常用。
const int * const cicptr 这种界说结合上面的剖析咱们知道是一个指向常量的常指针,也就说这个指针指向的地址是一个常地址,指针不能指向其他的目标或许地址。一起对指针cicptr来说,我指向的这个地址中的内容也是不能修正的,是一个常量,是不能修正的,可是该地址的数据能否修正还需求进行实践的剖析。

2、关于指针的初始化、赋值的问题
关于const类型的数据,假如需求界说指针,这时候只能界说const类型的数据,这是为什么呢?由于关于const目标来说,数据是必定不能修正的,假如界说指向非const的指针,程序员或许就会经过指针来修正目标的值,可是const目标是不能被修正的,必定会呈现过错。因而const的变量只能选用指向常量的指针来指向。一般来说假如将一个非const指针指向了一个const目标,编译的进程中就会抛出如下的过错:

invalid conversion from ‘const int*’ to ‘int*’

可是关于指向常量的指针并不一定指向的数据便是常量,这是一个非常重要的技能点,指向常量的指针指向的数据仅仅针对这个指针而言,他以为自己指向的数据是常量,休想经过他来修正指向的目标。也便是说指向常量的指针在初始化、赋值的时能够初始化或许赋值为非const变量的地址,即能够指向非const的目标,仅仅不能经过该指针来修正目标算了。
一起需求留意:关于指向const的指针,初始化进程比较便利,不要求是const目标的地址,能够选用非const目标的地址初始化,乃至还能够选用指向非const的指针直接赋值初始化,这时指针自己以为自己指向的目标是常量。可是不能将指向const的指针直接赋值给指向非const的指针,假如不小心赋值也会呈现上面呈现的问题。下面参看一段小的代码,阐明其间的一些问题。

#include
#include
#include

using namespace std;

int main()
{
int num = 20;
const int array_size = 10;

int *pnum = #
const int * cpnum = #
/*const int *指针能够选用int *指针直接初始化*/
const int *csize1 = pnum;

/*可是int * 指针不能选用const int *制造初始化*/
//int *psize = &array_size;
/*const类型数据只能选用指向const的指针来指向*/
const int *csize = &array_size;

cout << "Before change..." << endl;
cout << "The num of num = " << num << endl;
cout << "*pnum = " << *pnum << " "
<< "*cpnum = " << *cpnum << " "
<< "csize1 = " << *csize1 << endl;

num = 30;

cout << "After changed..." << endl;
cout << "The num of num = " << num << endl;
cout << "*pnum = " << *pnum << " "
<< "*cpnum = " << *cpnum << " "
<< "csize1 = " << *csize1 << endl;

return 0;
}


从上面的成果咱们能够知道指向const的指针能够选用非const变量的地址进行初始化或许赋值操作,一起也能够选用指向非const指针直接初始化指向const的指针。一起指向const的指针不能赋值给指向非const的指针,会呈现const int *不能转换到int *的问题。

3、const与引证
关于const和引证在一起状况下也存在一些相似于指针的状况,可是究竟引证比较指针要简略,这时候状况也比较简略.可是我以为剖析引证应该与剖析指针是相同也存在相似的问题。可是引证就只有两种,非const的引证和const的引证。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qianrushi/317762.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部