-
含义
引用不产生副本,只是给原变量起了别名。
对引用变量的操作就是对原变量的操作。 -
基本语法
数据类型 &别名 = 原名
e.g.
int a = 10;
int &b = a; //引用必须要初始化,一旦初始化后不可以更改:因为本指是指针常量,不可以修改指针的指向
可以通过赋值修改:
int main()
{
int a = 10;
int &b = a;
int c = 20;
b = c; //可以赋值,但是不能更改引用
cout << "a" << a << endl;
cout << "b" << b << endl;
system("pause");
}
发现更改了引用b的值之后,a的值也跟着改变了。
对引用变量的操作就是对原变量的操作。
-
引用作为函数参数
作用:传参让形参修饰实参
优点:简化指针修改实参。
void test01(&a)
-
引用作为函数返回值
#include <iostream>
using namespace std;
//返回局部变量引用
int& test01()
{
int a = 10; //局部变量存放在 栈区
return a;
}
//函数调用可以作为左值,调用完后返回a的引用。
//左值必须为可修改的值
int& test02()
{
static int a = 10; //静态变量,存放在全局区,全局区数据在程序结束后系统释放
return a;
}
int main()
{
// 不能返回局部变量的引用
// int &ref = test01();
// cout << ref << endl;
int &ref2 = test02();
cout << ref2 << endl;
test02() = 1000; //如果函数的返回值是引用,这个函数调用可作为左值,因为引用相当于返回了变量,可以被修改
cout << ref2 << endl;
system("pause");
}
- 引用的本质
在C++内部实现一个指针常量。
指针常量:指针的指向不可以修改,指针指向的地址的内存中的值可以修改。
//发现是引用,转换为 int* const ref = &a;
void func(int& ref)
{
ref = 100; // ref是引用,转换为*ref = 100
}
int main()
{
int a = 10;
//自动转换为 int* const ref = &a; 创建引用相当于创建了一个指针常量:指针的**指向固定**
int& ref = a;
ref = 20; //内部发现ref是引用,自动转换为:*ref = 20;
func(a);
}
- 常量引用
作用:修饰形参,防止误操作
#include <iostream>
using namespace std;
//打印数据函数
void showValue (const int& val)
{
//作用2: 防止误操作
//val = 1000; 报错,不能修改
cout << val << endl;
}
int main()
{
//常量引用
//使用场景:用来修饰形参,防止误操作
//作用1: 直接赋值(常值)
//加上const之后 编译器将代码修改 int temp = 10; const int &ref = temp;
//int& ref = 10; 报错,引用必须引一块合法的内存空间
const int& ref = 10;
//ref = 20; 报错,加入const之后变为只读,不可以修改
int a = 100;
showValue(a);
cout << a << endl;
system("pause");
}