关于C++的引用详解

引用的定义

int a = 0;
int& b = a;//定义一个引用变量指向a

从某种程度上来说,引用和它所指向的变量本身是相同的东西。可以通过引用来修改变量的值,例如

int a = 0;
int& b = a;
b = -1;
cout<<a<<endl; // -1
cout<<b<<endl; // -1

如果不希望通过引用改变变量的值,加上const限制即可。

int a = 0;
const int& b = a; // equal to int const & b = a;
//试图通过引用变量修改a的值
b = -1; //报错:表达式必须是可修改的左值

注意,这种写法是错误的❌:

int a = 0;
int& const b = a;

引用本身就是不变的,加上const修饰没有意义。这里所谓的“引用本身就是不变的”,意思是指引用一旦初始化指向某个变量之后,就不能指向别的变量了,它存储的实际上是变量的地址,和指针的作用一样,只是指针可以指向别的地址,但是引用不行。

注意:不能先声明定义一个引用,必须得在定义到同时就初始化。如下用法是错误的❌

int a = 0;
int& r; //先声明一个引用
r = a; //再初始化

指针可以先声明,再初始化,但是引用不行。

引用作为函数参数

如果引用作为函数参数,那么形参和实参将会绑定在一起,意思就是说他们所指向的空间都是一样的,那么修改形参,同样也能修改实参的值。最典型的引用是swap交换函数

#include<iostream>
using namespace std;
//通过引用交换
void swap_refer(int& a, int& b)
{
	int temp = a;
	a = b;
	b = temp;
}
//通过指针交换
void swap_point(int* a, int* b)
{
	int temp = *a;
	*a = *b;
	*b = temp;
}

int main()
{
	int x = 0;
	int y = -1;
	swap_refer(x, y);
	cout << "x = " << x << endl; //-1
	cout << "y = " << y << endl; //0

	swap_point(&x, &y);
	cout << "x = " << x << endl; //0
	cout << "y = " << y << endl; //-1

	return 0;
}

上述两种交换方式都能达到最终交换的效果。注意引用传参的时候直接穿变量名即可,而指针传参需要传变量的地址,在变量前加上取地址运算符&。

引用占用内存么

答:占用的,但是我们不能通过取地址运算符取到引用的地址。引用本身也是一种变量,引用类型的变量。但是它初始化之后就不能指向别的变量了,所谓变量是指:它指向的空间的地址不能改变,但是该地址存储的内容可变。

引用和指针的区别

1.指针有两级,但是引用没有,指针可以int **p,但是引用不能int &&r.
但不意味着不能定义引用的引用

int main()
{
	int a = 0;
	int& r = a;
	int& rr = r;
	rr = -1;
	cout << "a = " << a << endl; // -1
	cout << "r = " << r << endl; // -1
	cout << "rr = " << rr << endl; // -1
	return 0;
}

但是定义引用的引用似乎没有什么意义,指向的都是同一块存储空间,操作的都是同一个变量。
2.自增运算符
指针的值自增是对地址操作,表示指向下一个元素,引用自增是对值操作,表示+1.

3.不能建立数组的引用。
4.指针可以先声明再初始化,引用必须在声明的时候就初始化。

引用的本质

引用的本质是指针的封装形式,依然是用指针实现的,只不过封装成指针,方便用户使用。之所以不能获取引用的地址,是因为编译器进行了内部转换。

int main()
{
	int a = 0;
	int& r = a;
	r = -1;
	cout <<  &r << endl;
}
//实际上是
int main()
{
	int a = 0;
	int* r = &a;
	*r = -1;
	cout << r << endl;

}

const 引用

前面说过,如下写法是错误的,因为引用指向的地址本身就不能再变,加上const没有意义。在VS2019中,这样写不会报错,但是有warning。在DEV中直接报错

int a = 0;
int& const b = a; //错误

[Error] 'const' qualifiers cannot be applied to 'int&'

但是是可以在整个定义前加上const的,这样的意思是不能更改b的值,也就是a的值。

int a = 0;
const int& b = a;
b = -1; //错误
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值