C++出现了新的概念:引用。引用是某个对象的别名。
语法格式如下:
类型&引用名=变量名;
#include <iostream>using namespace std;int main(int argc, const char *argv[])
{int i = 100;int &ir = i;//给变量i起了个别名 叫ircout << "i = " << i << endl;cout << "ir = " << ir << endl;cout << "i的地址:" << &i << endl;cout << "ir的地址:" << &ir << endl;//输出内容,地址相同return 0;
}
引用应用
#include <iostream>
using namespace std;void swap(int *a, int *b) {int temp = *a;*a = *b;*b = temp;
}void swap1(int &a, int &b) {int temp;temp = a;a = b;b = temp;
}int main(int argc, const char *argv[])
{int x = 10;int y = 20;swap(&x,&y);swap1(x,y);cout << "x=" << x << " "<< "y=" << y << endl;return 0;
}
引用和被引用者是同一块地址
已用用途
- 简化编程,用指针的场景可以用引用替换(尽量减少指针的使用)
- 系统开销更小
使用引用需要注意以下几个问题
&的位置是灵活的,以下几种定义完全相同
int& ir = i;
int & ir = i;
int &ir = i;
在变量声明时出现&才是引用运算符(包括函数参数声明和函数返回类型的声明)
int &ri = i;
int &f(int &i1,int &);
引用必须定义时初始化
float f;
float &r1 = q;
float &r2;
r2 = f;//错误
const 引用(常引用)。在定义引用时一般为左值(变量)
左值:是指变量对应的那块内存区域,是可以放在复制符号左边的值;
右值:是指变量对应的内存区域中储存的数据值,是可以放在复制符号右边的值
常量、表达式都是右值,例如
int i =1;
i = i + 10;
i + 10 = i;//错误
i = 10;
10 = i;//错误
可以使用const进行限制,使他成为不允许被修改的常量引用(也叫万能引用)
int &i = 100;//errno
const int &i = 100;//ok的
char &c = a;//错误,将c转换char 类型,转换结果保存到临时变量中,实际引用临时变量,而临时变量是右值
引用的本质
引用的本质就是指针常量。
//int *const x = &m;int *const y = &n;
void swap(int &x,int &y) {int tmp = 0;tmp = x; //tmp = *x;x = y; //*x = *y;y = tmp;// *y = tmp;
}int main(void) {int m = 10,n = 20;swap(m,n);return 0;
}