目录
引 用 注 意 事 项
作用:给变量起别名
-
语法:原名数据类型 &别名 = 原名
int main()
{
int a = 10;
int &b = a;
b = 20;
cout << b << endl;
system("pause");
return 0;
}
引用必须初始化
-
引用在初始化后,不可以改变
int &b; // 错误
int main()
{
int a = 10;
int c = 20;
int& b = a;
int& b = c; // 错误
system("pause");
return 0;
}
error C2374: “b”: 重定义;多次初始化
引 用 做 函 数 参 数
作用:函数传参时,可以利用引用的技术让形参修饰实参
-
优点:可以 简 化 指 针 修 改 实 参
简单的交换函数
void swap(int& a1, int& b1)
{
int temp = 0;
temp = a1;
a1 = b1;
b1 = temp;
}
int main()
{
int a = 10;
int b = 20;
swap(a, b);
cout << "a = " << a << endl;
cout << "b = " << b << endl;
system("pause");
return 0;
}
swap 函数参数中的 a1 和 b1 是 下方传入的 a 和 b 的别名
理解为:
int& a1 = a;
int& b1 = b;
引 用 做 函 数 返 回 值
作用:引用是可以作为函数的返回值
int& test();
注意:不 要 返 回 局部变量 引 用
-
用法:函 数 调 用 可 以 作 为 左 值
不要返回局部变量引用
// 不要返回局部变量的引用
int& test1()
{
int a = 10; // 局部变量存放在栈区
return a; // 返回局部变量的引用,错误
}
int main()
{
int& ref = test1(); // 非法访问
cout << ref << endl;
cout << ref << endl;
system("pause");
return 0;
}
C4172: 返回局部变量或临时变量的地址: a
int& ref = test1(); // 错误
想让上面的代码正常访问,可以将 局部变量 a 改成 全局变量(静 态 变 量)
int& test()
{
static int a = 10; // 静态变量,全局区,系统释放
return a;
}
int main()
{
int& ref = test();
cout << ref << endl;
system("pause");
return 0;
}
函数调用作为左值
(左值 - 赋值 (=)左边的的值)
int& test()
{
static int a = 10; // 静态变量,全局区,系统释放
return a;
}
int main()
{
test() = 20; // 函数调用作为左值
cout << test() << endl;
system("pause");
return 0;
}
引 用 本 质
本质:引用的本质在 C++ 内部实现是一个 指 针 常 量
// 发现引用,转化为 int* const ref = &a; void fun(int& ref) { ref = 100; // ref 是引用,转化为 *ref = 100 } int main() { int a = 10; // 自动转化为 int* const ref = &a; 指针常量,指针方向不能变,也就说明了为什么引用不可改变 int& ref = a; ref = 20; // 内部发现 ref 是引用,自动转化为 *ref = 20; cout << "a:" << a << endl; cout << "ref:" << ref << endl; fun(a); return 0; }
发现引用,转化为 int* const ref = &a;
指针常量,指针方向不能变,也就说明了为什么引用不可改变
内部发现 ref 是引用,自动转化为 *ref = 20;
常 量 引 用
作用:常量引用主要用来修饰形参,防止误操作
-
在函数形参列表中,可以加 const 修 饰 形 参 ,防 止 形 参 改 变 实 参
引用必须引用合法的内存空间,必须引用栈区和堆区数据,10 在常量区
int& ref = 10; // 非法引用
加入 const 变为只读状态不可以修改
const int& ref = 10; // 合法访问
修饰形参防止误操作
// 打印 a
void print(const int& a)
{
cout << a << endl;
}
int main()
{
int a = 10;
print(a);
system("pause");
return 0;
}
加上 const 修饰 再对 a 进行修改 ,非法操作
error C3892: “a”: 不能给常量赋值