引用(reference)就是给对象起的别名(在人来看,似乎有两个名称,但计算机来看,就是同一个地址!)
如:赵云,字子龙。赵云是他,赵子龙也是他。
定义引用时,把引用和它的初始值绑定在一起,而不是将初始值拷贝给引用
引用本身并不是对象,所以不能定义引用的引用
引用做函数参数
实际是传地址,把值的地址告诉函数,函数里任何对值的操作,就在值的地址操作。就好比如:上门做菜,你告诉厨师食材在哪(值地址)、怎么做,然后厨师咔嚓咔嚓一顿操作(函数算法),菜就做好了,然后厨师告诉你做好了,你就可以享用美食了(无需拷贝到原处)(#.#)。
#include<iostream>
void swap1(int a, int b){
int temp = a;
a = b;
b = temp;
}
void swap2(int *a, int *b){
int temp = *a;
*a = *b;
*b = temp;
}
void swap3(int &a, int &b){
int temp = a;
a = b;
b = temp;
}
int main()
{
int i = 5;
int m = 6;
swap1(i, m); //输出:i=5,m=6。值传递,形参不会修饰实参
swap2(&i, &m); //输出:i=6,m=5。指针(地址)传递,形参会修饰实参的
swap3(i, m); //输出:i=6,m=5。引用传递,形参会修饰实参的
}
返回引用
- 不要将局部变量作为返回值
- 函数的返回值可以作为左值存在
#include <iostream>
using namespace std;
1.不要将局部变量作为返回值
int& test1()
{
int i = 10;//局部变量,存在四区中的栈区
return i;
}
2.函数的返回值可以作为左值存在
int& test2()
{
static int x=10; //静态变量,存在四区中的全局区
return x; // 安全,x 在函数作用域外依然是有效的
}
int main()
{
int& ret = test1();
cout << "ret=" << ret << endl;//第一次结果正确,是因为编译器做了保留;
cout << "ret=" << ret << endl;//第二次结果错误,是因为局部变量被释放了;
int& ret2 =test2();
cout << "ret=" << ret2 << endl;//输出10
cout << "ret=" << ret2 << endl;//依旧10
test2() = 100;
cout << "ret=" << ret2 << endl;//输出100
}