一、引用概念
int a=10;
int&b=a;
在以上代码中,我们称b是a的引用。
通俗的来说,就是给a取了给外号叫b,你使用b其实就是在使用a,他们的地址都是一样的。
一个元素还可以有多个引用
int a=10;
int&b=a;
int&c=b;
上面的代码中b和c都是a的引用,地址都是一样的。
引用还有几个特性
- 创建时必须初始化
- 引用的对象不能修改
- 一个变量可以有多个引用
- 引用的类型和被引用的类型要一致
int a=10;
int&b=a;
int&c=b;
int x=20;
b=x;
上面的代码中,是把x的值赋值给了b,这使得a和c的值都变成了20,并不能实现把b的指向修改成x。
————————————————————————————————————
常引用
当被引用的实体是常量时,就不能使用变量引用对其引用l
const int a=10;
//int &b=a;//这个会报错
//int&b=10;//这个会报错
const int &b=10;
int c=20;
const int &d=c;//这样之后就不能修改d的值了,但是仍然可以通过c修改其值
二、引用的应用
1.做函数参数
void Swap(int& left, int& right)
{
int temp = left;
left = right;
right = temp;
}
在上面的代码中,调用该函数时,直接传入变量名即可,这时形参left和right就成了传入变量的引用,
所以以上的代码可以完成数据的交换
2.做函数返回值
int& Count()
{
static int n = 0;
n++;
// ...
return n;
}
使用引用当返回值的时候要注意,返回被引用变量的生命周期
int& Add(int a, int b)
{
int c = a + b;
return c;
}
int main()
{
int& ret = Add(1, 2);
Add(3, 4);
cout << "Add(1, 2) is :"<< ret <<endl;
return 0;
}
这串代码输出的结果就是随机值,因为返回的c的引用,而c的生命周期已经结束了
3.其他
在底层实现逻辑上,引用和指针其实是一样的,所以效率也是一样的
二、内联函数
当一个小型函数要进行大量的调用时候,重复建立栈帧的动作会消耗大量的性能,内联函数的出现就是为了解决这个问题,在定义函数的时候在前面加上 inline 关键字就能建议编译器将此函数成为内联函数
inline void swap(int&a,int&b)
{
int tmp=a;
a=b;
b=tmp;
}
内联函数的实现就是在调 用该函数的位置将其展开,避免建立栈帧,但是直接展开会导致代码量加大,所以你在函数声明前加上inline之后,编译器会对函数进行判断,如果函数代码量比较大,则这个函数不会成为内联函数