【C++】引用的基本概念和使用场景


前言

本文将会介绍C++相对于C语言引入的一个新语法引用。–文章主要从引用的概念引用使用的场景以及引用和指针的区别三个方面进行介绍。


一、什么是引用

引用就像我们给朋友取外号一样,张三是他的真名而狗蛋是给他取的小名。当我们喊张三或者狗蛋时这个人都会回应,引用也是如此。
引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。
语法:类型& 引用变量名(为实体名取的别名) = 实体名

#include <iostream>
using namespace std;
int main()
{
    
    
	int a = 0;
	//b成为了a的别名,对b的赋值,加减等各种运算也会对a进行相应的改变
	int& b = a;
	//输出a和b两个变量的地址,可以看到是相同的,说明两个变量共用一块空间
	cout << &b << endl;
	cout << &a << endl;
	return 0;
}

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


二、引用的特性

1.引用必须进行初始化

#include <iostream>
using namespace std;
int main()
{
    
    
	int a = 0;
	//int& b;此处编译器会报错,引用必须初始化
	int& b = a;
	return 0;
}

2.引用一旦引用一个实体后就不能再引用其它实体

初学者常认为以下代码实现了b转向去引用c,但其实它实现的只是一个复制的功能

#include <iostream>
using namespace std;
int main()
{
    
    
	int a = 0;
	int c = 1;
	int& b = a;
	b = c;//把c的值赋给了b
	return 0;
}

3.一个实体可以有多个引用

#include <iostream>
using namespace std;
int main()
{
    
    
	int a = 0;
	//b和m都是a的引用
	int& b = a;
	int& m = a;
	return 0;
}

4.常量引用

#include <iostream>
using namespace std;
int main()
{
    
    
	const int a = 10;
	//这条语句会报错是因为,a为常量
	//当我们用非常量类型的b去作为a的引用,则a的内容可能会因为b的改变而被修改
	//为了避免这样的情况发生,我们必须用同为常量的类型作为a的引用
	//int& b = a;

	const int& b = a;
	return 0;
}

三、引用的使用场景

1.做参数

//这样就可以不使用指针而实现两个数的交换
void Swap(int& a, int& b)
{
    
    
	int tem = a;
	a = b;
	b = tem;
}

2.做返回值

//这样就返回了静态变量c的引用
int& test()
{
    
    
	static int c = 5;
	c++;
	return c;
}

注意!放一个变量出了作用域被销毁时,不能返回它的引用,如下所示

int& test()
{
    
    
	int c = 5;//c出了函数会被销毁,所以不能返回它的引用
	c++;
	return c;
}

四、引用和指针的区别

1.语法层面

指针是开辟了一段内存空间来存储被指向变量的地址。
引用是一个别名,没有独立空间,何其引用的主体共用一块空间。
可以从以下代码可见引用变量和实体的地址是共用一块空间

#include <iostream>
using namespace std;
int main()
{
    
    
	int a = 4.0;
	int& b = a;
	cout << "&a = " << &a << endl;
	cout << "&b = " << &b << endl;
	return 0;
}

在这里插入图片描述

2.底层实现

在底层实现上引用实际是按照指针的方式实现的。
将下列代码转到汇编代码即可看到指针和引用在底层的实现方式是相同的。

#include <iostream>
using namespace std;
int main()
{
    
    
	int a = 4;
	int& b = a;
	b = 10;

	int* pa = &a;
	*pa = 10;
	return 0;
}

在这里插入图片描述在这里插入图片描述

3.其它不同点

1、引用概念上定义一个变量的别名,指针存储一个变量地址。
2、引用在定义时必须初始化,指针没有要求。
3、引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何
一个同类型实体。
4、 在sizeof中含义不同:引用结果为引用类型的大小,但指针始终是地址空间所占字节个数。
6. 引用自加即引用的实体增加1,指针自加即指针向后偏移一个类型的大小。
7. 有多级指针,但是没有多级引用。
8. 访问实体方式不同,指针需要显式解引用,引用编译器自己处理。
9. 引用比指针使用起来相对更安全。


总结

本文介绍了引用的基本概念、特性和使用场景,以及指针和引用的区别。希望这篇文章能对您有所帮助。

猜你喜欢

转载自blog.csdn.net/weixin_63614711/article/details/130520168