人物

manbetx.ccC++中const与指针、引用的分析

字号+ 作者:manbetx.cc 来源:未知 2017-12-21 19:42 我要评论( )

万博体育ManbetX(manbetx.cc)投注24小时不间断的服务,万博体育ManbetX的用心随处可见,并获得GEOTRUST国际认证,万博网页版是一家创办历史悠久的知名体育娱乐网! 援用是对象的别号,必需正在初始化的过程中取一个具体的对象绑定起来,绑定完成当前就再也不成

万博体育ManbetX(manbetx.cc)投注24小时不间断的服务,万博体育ManbetX的用心随处可见,并获得GEOTRUST国际认证,万博网页版是一家创办历史悠久的知名体育娱乐网!

  援用是对象的别号,必需正在初始化的过程中取一个具体的对象绑定起来,绑定完成当前就再也不成以或许点窜了,援用貌似和指针有很大的类似性,可是援用是援用,是一个体名,而指针是一个变量,只是变量中保留的是对象的地址,援用并不分派新的内存空间。因而一个援用取一块内存区域绑定,是这块内存区域的别号,就好像数组名一样,数组是内存中的一块区域,数组名是这块区域的名字,可是正在内存中并不存正在额外的区域保留数组名。援用就是一块内存区域的别号。C++中变量本色上就是一块内存区域,我们正在用&i就能够获得变量i的地址,也就是说变量是这块区域的名字。对变量的操做本色上就是对这块内存中内容的操做。别号是这块区域的另一个名字。采用任何一个名字对这块区域点窜城市影响区域的内容。

  上面的int &refr = vari本色上就是变量vari的别号,也就是保留vari变量地址的别号,这个地址中保留的是一个int类型的数据,数据能够通过vari来操做,能够点窜。由于refr是一个体名,也能够通过该别号对这块内存区域进行操做。也就是说别号的操做就是针对一块特定的内存区域,这个通过变量操做的结果是分歧的。

  const的引入使得正在函数操做中的一些问题复杂了,可是愈加的合理了,const限制符是指上是指一个常量。这个常量正在一般的环境下就是限制变量不克不及点窜,可是当这个限制符取援用、指针连系正在一路时,使得良多的问题不正在开阔爽朗。

  上面是关于const取指针连系时的各类环境,这并不只是C++中经常碰到的问题,正在C言语中也会有雷同的会商,虽然const并不是C言语中的环节字。

  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来说,我指向的这个地址中的内容也是不克不及点窜的,是一个常量,是不克不及点窜的,可是该地址的数据可否点窜还需要进行现实的阐发。

  对于const类型的数据,若是需要定义指针,这时候只能定义const类型的数据,这是为什么呢?由于对于const对象来说,数据是必定不克不及点窜的,若是定义指向非const的指针,法式员可能就会通过指针来点窜对象的值,可是const对象是不克不及被点窜的,必定会呈现错误。因而const的变量只能采用指向常量的指针来指向。一般来说若是将一个非const指针指向了一个const对象,编译的过程中就会抛出如下的错误:

  可是对于指向常量的指针并不必然指向的数据就是常量,这是一个很是主要的手艺点,指向常量的指针指向的数据只是针对这个指针而言,他认为本人指向的数据是常量,休想通过他来点窜指向的对象。也就是说指向常量的指针正在初始化、赋值的时能够初始化或者赋值为非const变量的地址,即能够指向非const的对象,只是不克不及通过该指针来点窜对象而已。

  同时需要留意:对于指向const的指针,初始化过程比力便利,不要求是const对象的地址,能够采用非const对象的地址初始化,以至还能够采用指向非const的指针间接赋值初始化,这时指针本人认为本人指向的对象是常量。可是不克不及将指向const的指针间接赋值给指向非const的指针,若是不小心赋值也会呈现上面呈现的问题。下面参看一段小的代码,申明此中的一些问题。

  从上面的成果我们能够晓得指向const的指针能够采用非const变量的地址进行初始化或者赋值操做,同时也能够采用指向非const指针间接初始化指向const的指针。同时指向const的指针不克不及赋值给指向非const的指针,会呈现const int *不克不及转换到int *的问题。

  关于const和援用正在一路环境下也存正在一些雷同于指针的环境,可是终究援用比拟指针要简单,这时候环境也比力简单.可是我认为阐发援用该当取阐发指针是一样也存正在雷同的问题。可是援用就只要两种,非const的援用和const的援用。

转载请注明出处。

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
网友点评