为什么要引入 “引用”?
在C程序中,我们会声明一个指针变量来指向某个变量的存储地址,p=&a,&是求变量地址运算符,用于求出a对应存储空间的首地址,再存入指针变量p中
int *p;
int a;
p=&a;
此时 *p=30 与 a=30 作用都是 给a赋值30
*p 就是 *&a
但是C程序中,指针用着太麻烦了,因此C++新增个引用,更加方便
所谓引用,一句话:给变量起个别名
int i;
int &j = i;
//声明 j是i的引用,i和j指向同一块存储空间
语法:
数据类型 &引用变量名 = 已定义的被引用的变量名
说说引用
- 引用必须在声明时就要进行初始化
int i;
int &j;
j = i; 这种是错误的,系统会理解成赋值,而不是引用
因此
int &j=i; 声明时就要进行引用
-
一个变量可以有多个引用
int i; int &j1=i; int &j2=j1; 或 int &j2=i;
-
不存在void类型的引用、不能定义数组的引用,不能定义引用的引用,不能定义指向引用的指针变量。
因为引用不是数据类型
-
特别点:只需要在声明时使用&符,此后就不再出现,因此&符虽然是引用运算符、地址操作符,但是在使用上是不同的
引用的优点
引用可以降低运行时间和代码量
因为系统不给引用类型的变量分配存储空间,基于此,我们在声明函数时,将形参定义为引用类型,形参引用实参,这样就保证了这俩的值是相同的。
不用将实参变量的值赋值给引用类型的形参变量。这样节约了存储空间
#include<iostream>
using namespace std;
int swap(int& a, int& b) {
if (a > b)
return b = a;
return b;
}
int main() {
int i=100,m=20;
swap(i, m);
cout << m;
return 0;
}
在这个例子里,我们没有写 int &a=i int &b=m;
而且系统也不会给a和b申请存储空间。所以在函数的形参上通常都定义为引用 ,养成习惯,以后参与大型项目,这样会提高程序的效率、性能。
让你看起来更像大神
如果你将函数的返回值定义为引用,这种方式,可以将函数调用放在赋值运算符的左侧,来接受右侧表达式的值,看起来更加牛。
#include<iostream>
using namespace std;
int &swap(int& a,int& b) { ##看此处
if (a > b)
return b = a;
return b;
}
int main() {
int i,m;
swap(i, m)=100,20; ##看此处
cout << m;
return 0;
}
函数返回一个引用时,会返回一个指针,会进行解引用操作,实际上可以修改静态变量b的值,因此函数就可以放在左边了
swap()=100 ----> b = 5 -----> *b = 5
除了将函数返回值定义为引用之外,函数的返回值是不能写在赋值运算符左边的