目录
1, 什么是引用
引用就是给一个变量取别名, 语法是数据类型 &变量别名 = 变量名, 引用和原变量都指向相同的对象, 任意一个修改都会映射到另外一个
#include <iostream>
#include <string>
using namespace std;
/*别名和原变量指向相同的对象, 别名修改值会映射到原变量*/
int main()
{
int a = 10;
//变量a取别名为b
int& b = a;
//修改b的值
b = 20;
//因为b指向的是a的地址, 所以a也被修改
cout << "a=" << a << endl;
cout << "b=" << b << endl;
system("pause");
return 0;
}
-----------------------------------------------
输出结果:
a=20
b=20
1-1, 引用注意事项
引用必须要先初始化,再使用,否则编译器会报错
#include <iostream>
#include <string>
using namespace std;
/*别名和原变量指向相同的对象, 别名修改值会映射到原变量*/
int main()
{
int a = 10;
//引用b未初始化, 编译器会报错
//int& b;
int& b = a;
int c = 20;
//将c的值复制给b, 这样操作后a, b的值都被修改为c的值
b = c;
cout << "a=" << a << endl;
cout << "b=" << b << endl;
cout << "c=" << c << endl;
system("pause");
return 0;
}
------------------------------------------------------
输出结果:
a=20
b=20
c=20
注意:同名引用不能重复定义
int a = 10;
int& b = a;
int c = 20;
//与上面的引用b重复定义,会报错
int& b = c;
1-2, 引用做形参
通过引用做形参, 形参的修改会映射到实参
#include <iostream>
#include <string>
using namespace std;
/*引用做形参式, 形参修改会映射到实参*/
void swap(int& a1, int& b1)
{
int tmp;
tmp = a1;
a1 = b1;
b1 = tmp;
}
int main()
{
int a = 10;
int b = 20;
swap(a, b);
cout << "a=" << a << endl;
cout << "b=" << b << endl;
system("pause");
return 0;
}
---------------------------------------------------------
输出结果:
a=20
b=10
1-3, 引用做函数返回值
#include <iostream>
#include <string>
using namespace std;
//函数返回的是a的引用
int& func()
{
//若不加static, a是局部变量,在栈区,函数调用完会释放
static int a = 10;
return a;
}
int main()
{
cout << "调用func:" << func() << endl;
//引用类型的函数作为左值使用
func() = 1000;
cout << "调用func:" << func() << endl;
system("pause");
return 0;
}
----------------------------------------------------
输出结果:
调用func:10
调用func:1000
1-4, 引用的本质
引用本质上就是一个指针常量(指向不能修改,指向的值可以修改)
int a = 10;
//编译器会翻译为 int * const b = &a
int& b = a;
//编译器会翻译为* b = 20
b = 20;
//引用本质是指针常量, 指针是不能附具体的值的,下面会报错
int& b = 1000;
1-5, 常量引用
常量引用用来修饰形参不会被误修改
#include <iostream>
#include <string>
using namespace std;
//概述返回的是a的引用
int func(const int & a1)
{
//引用a1被定义为一个常量, 所以下面的修改会报错
a1 = 1000;
return a1;
}
int main()
{
int a = 10;
//编译器翻译成int tmp = 1000; int &b = tmp, 所以不会报错
//const int& b = 1000;
cout << "调用func:" << func(a) << endl;
system("pause");
return 0;
}