一、引用的介绍
引用还有一个别的叫法:取别名
通俗点说:每个人都有一个大名,可能也有一个小名,但是都是指一个人,引用也就是一个变量的别名。
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;
}
以下是该代码的反汇编:
我们可以发现指针和引用的实现是完全一致的
注:其实我们就可以认为当给引用重新赋值时,编译器自动将*这一操作符补上了。