C++ : 引用的实质理解 !!!!

来源:互联网 发布:冯大辉 知乎匿名 编辑:程序博客网 时间:2024/05/16 02:11

   引用的定义:在类型和标识符之间加上一个取地址符,说明该标识符为指定类型的引用

        如: int &ref = num;   就是ref是一个int型的引用

 

  引用有什么作用呢?  看下面代码就知道了:

  

 

第一行输出 :   ref = 12,num = 12

第二行输出 :   ref = 16,num = 16

第三行输出 :   ref = 18,num = 18

    由上面三行输出可以看出引用ref随着num的值的改变而改变,再看下面的输出

 

  

第四行输出 :   &ref = 0xbfffeb44,&num = 0xbfffeb44

    当取地址符的时候可以看到引用标识符和被引用变量的地址都是同一个;至止明白引用的实质就是给某个变量定义了一个别名,也就是说别引用和引用的变量共用同一块内存空间

   

   下面我们看如果给ref赋值的话会发生什么情况:

第五行输出 :   ref = 21,num = 21

    可以看出给ref赋值的同时 ,也改变了被引用的num的值,这里注意的是只把num1的值传给了ref,而不是将ref变成了num1 的引用...通过下面的地址输出结果可以知晓~~

   

第六行输出 :   &ref = 0xbfffeb44,&num = 0xbfffeb44,&num1 = oxbfffeb40

      通过第六行的输出可以知道:引用一旦初始化为某一个变量,那么该引用不可能成为另外变量的引用;
  也就是说引用只可以在初始化的时候赋值初始化以后只能发生数值的变化,不能发生源的变化

补充:引用是一个变量,但和普通变量不同的是在定义的时候引用一定要初始化

          即不能只定义: int &ref  ;      //不初始化赋值是错误的

 

下面给出个例子简单的看下引用应用的例子:

 

运行输出结果: num1 = 21;num2 = 12    //指针传递参数

                     num1 = 21;num2 = 12   //引用传递参数

 

  在这里肯定有人认为这引用跟指针不是一样的么,也是取变量的地址,通过地址来操作地址所指空间的数据么...      下面是引用与指针的四大区别:

非空区别

     在任何情况下都不能使用指向空值的引用(继上面引用要初始化...),一个引用必须总是指向某些对象. 不存在批向空值的引用这个事实意味着使用的代码效率要比使用指针搞

合法性区别

     在使用引用之前不需要测试他的合法性;相反,指针总是被测试,如:防止其为空等

可修改区别

     指针可以被重新赋值以指向另外一个不同的对象;引用则总是指向初始化被指定的对象,以后不能改变,但指定对象的内容可变化

应用性区别

      在两种情况下应用指针:一是考虑到存在不指向任何对象的可能; 二是需要在不同的时刻指向不同的对象.如果总是指向一个对象并且一旦指向一个对象 就不会改变指向,应该使用引用...(有点像花花公子跟情圣的区别...)