引用的定义
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; //错误