一、引用的介绍

引用还有一个别的叫法:取别名

通俗点说:每个人都有一个大名,可能也有一个小名,但是都是指一个人,引用也就是一个变量的别名。

1.引用的概念:

引用不是定义一个别的变量,而是给一个变量取别名

注:引用变量编译器不会为这个变量单独开辟一块内存,它和它引用的变量使用同一块内存

2.引用的定义方法

变量类型& 引用变量名(对象名)=实体;

#include<iostream>
using namespace std;
int main()
{
  int a=10;
  int& p=a;
  cout<<"a="<<a<<endl;
  cout<<"p="<<p<<endl;
}

输出:

a=10

b=10

#include<iostream>
using namespace std;
int main()
{
  int a=10;
  int& p=a;
  cout<<"&a="<<a<<endl;
  cout<<"&p="<<p<<endl;
}

输出结果 a和p的地址是一模一样的

所以说明:a和p指向的空间是一置的,a改变p也会改变

注:引用类型和引用实体必须是同种类型的

二、引用的特性

1.注:引用在定义时要初始化

#include<iostream>
using namespace std;
int main(void)
{
  int a=10;
  //int& p;//不初始化会报错
  int& p=a;
}

2.一个变量可以有多个引用

#include<iostream>
int main()
{
  int a=10;
  int& b=a;
  int& c=a;
  int& d=a;
}

3.引用不能多次初始化

#include<iostream>
using namespace std;
int main(void)
{
  int a=10;
  int& pe=a;
  int b=20;//这样编译器就会报错,错误:pe多次初始化
  int& pe=b;
}

三、引用与指针(重要)

 前言:我在讲引用的定义方法的时候,得出了引用变量名和实体所指向的空间是一样的,所以我们再计算一下引用和指针的大小等一些问题

#include<iostream>
using namespace std;
int main(void)
{
  int a=10;
  int& re=a;
  int* p=&a;
  cout<<sizeof(re)<<endl;
  cout<<sizeof(p)<<endl;
  cout<<"----------------"<<endl;
  char b='a';
  char& rb=b;
  cout<<sizeof(rb)<<endl;
}

由此我们可以得出,引用的大小和类型有关系,int类型的引用大小就为4,char类型的引用大小就为1

看似引用和指针确实关系不大,但是引用和指针在底层的实现没有任何区别,如果不信就看下面这段代码:

#include<iostream>
using namespace std;
int main(void)
{
  int a=10;
  int& ra=a;
  ra=20;
  int* pa=&a;
  *pa=20;
}

以下是该代码的反汇编:

【c++】引用的用法_初始化

我们可以发现指针和引用的实现是完全一致的

注:其实我们就可以认为当给引用重新赋值时,编译器自动将*这一操作符补上了。