引用的特点

引用的语言层特点

  引用的作用是为变量起一个别名。

int a;
int &b = a;

int 牛二;
int & 二蛋 = 牛二;

  上例中,定义了一个变量a,而b是a的别名。牛阿姨生了一个Baby叫牛二,牛二有个小名叫二蛋。张大爷叫二蛋的时候,牛二知道叫的就是他。类似的,程序员在读写b的时候,也就是再读写a。

 

引用的主要用途

  1. 在于函数调用时,能通过修改形参的值而改变对应实参的值。
  2. 使用引用编程,程序员编程更加直观。

example 1:

#include <iostream>
using namespace std;

void swap(int a ,int b)
{
  int tmp;
  tmp = a;
  a= b;
  b = tmp;  
}

void main()
{
  int i = 1, j =2;
  ......
  swap(i,j);
  ......
}

  虽然编程看着挺直观,但是不能交换i,j的值,因为形参和实参是不同的内存单元。

example 2:

#include <iostream>
using namespace std;

void swap(int *a ,int *b)
{
  int tmp;
  tmp = *a;
  *a= *b;
  *b = tmp;  
}

void main()
{
  int i = 1, j =2;
  ......
  swap(i,j);
  ......
}

  用指针肯定能交换i,j的值,通过形参中的地址可以访问到原始的实参变量,可以修改实参的内容。但是,这种方式,编程不直观,总是要在变量前边加一个"*"号。

example 3:

#include <iostream>
using namespace std;

void swap(int &a ,int &b)
{
  int tmp;
  tmp = a;
  a= b;
  b = tmp;  
}

void main()
{
  int i = 1, j =2;
  ......
  swap(i,j);
  ......
}

  使用引用方式,既可以从形参那里修改实参的值,同时编程直观。

小结

  引用规避了直接传递和指针传递两种方式的缺点,而集中它们的优点,衍生出来的一种更优秀的传递方式。

 

==============================================================

引用的实现机制上

  引用的实现机制上,是一个“常量指针”。在最开始的例程中,定义了一个引用型变量b,编译器会将其按照指针的操作方式,将a的地址赋给b。

  引用用在函数调用上,本质上与指针传递参数没有差别。只不过指针传递参数有两个缺点,其一是操作不直观;其二指针指向可能会被修改,这样的编程不安全。而引用相当于是对指针传递参数这种方式进行了封装,规避了这两种缺点。对于程序员编程来说,他不再为指针传递参数的缺点而苦恼,因为编译器已经帮助他完成了这部分工作,而事实上他进行的操作就是指针传递参数。

 

  引用和指针传递参数无论是在效率上还是在空间上都是完全一样的,如果妄想不传入地址就修改实参的值,简直就是天方夜谭,这就说明引用的本质就是指针。毕竟它们的行为都太相似了,如果不是这样,你还有什么方法去实现引用吗?记住,引用只不过是编译器为你提供的一个有用且安全的工具,对于机器代码可无法表示它,它把指针一对多的缺点去除,禁止了你的不安全的操作。但回到问题的本源,他们没有任何区别。

                                摘自:引用的本质是什么?

 

参考博客:

  引用的本质是什么?
      从底层汇编理解 c++ 引用实现机制

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值