引用 Reference
在C语言中,使用指针(pointer)可以间接获取、修改某个变量的值。
int a = 10;
int *p =
*p = 20;
// a = 20;
在C++中,使用引用(Reference)可以起到跟指针类似的功能。
引用的本质就是指针,指示编译器削弱了它的功能,所以引用就是弱化了的指针。
int age = 10;
// 定义了一个age的引用,refAge相当于是age的别名
int &refAge = age;
refAge = 20; // 等同于age = 20;
// age = 20;
引用指针
int age = 10;
int *p =
int * p; // ref == p
*ref = 30;
int height = 30;
ref =
引用数组
int array[] = {1,2,3};int (&ref)[3] = array;ref[0] = 10;
补充:
int *arr[3]
指针数组,里面可以存放3个int *
比如: int *p; int *arr[3] = {p, p, p};
int (*arr)[3]
数组指针,用于指向数组的指针
-
注意点
-
引用相当于是变量的别名(基本数据类型、枚举、结构体、类、指针、数组等,都可以有引用)
-
引用的类型必须匹配
-
一个引用占一个指针的大小
-
对引用做计算,就是对引用所指向的变量做计算
-
在定义的时候就必须初始化,一旦指向了某个变量,就不可以再改变,“从一而终”
指针就可以随意修改指向,引用不可以。
-
可以利用引用初始化另一个引用;相当于某个变量的多个别名。
int age;int ref;int ref1; // ref1, ref2, ref 都是 age
-
不存在引用的引用、引用数组
-
-
存在的价值:
-
比指针更安全
因为指针可以随意修改指向,所以就可能指向不该指的地方。
引用初始化时必须指向一个变量,不会说指向某个未知的内存。
-
函数返回值可以被赋值
-
-
引用常用的场景
- 函数传参引用
**问:不是说引用是从一而终嘛?**
每一次调用函数都会重新创建一个变量,每次创建的v1和v2都是全新的,内存都是全新的。
局部变量使用完销毁后再次重新开辟空间被使用。
-
常引用
int age = 10;const int age;ref = 30; // 错误
可以访问但不能改动
但变量本身是可以改动的:age = 20; 是没有问题的,ref 的值也变为20。
-
特点:
-
可以指向临时数据(常量、表达式、函数返回值等)
-
可以指向不同类型的数据
int age = 10;const double age;
注意!当常引用指向了不同类型的数据时,会产生临时变量,即引用指向的并不是初始化的那个变量。
int age = 10;const long age;age = 30;// age = 30// rAge = 10
rAge 并没有随着 age 的改变而改变。
看底层实现:
-
-
所以最后30并没有传给rAge,所以rAge的值并没有改变。
-
作为函数参数时(此规则也适用于const指针
-
可以接受const和非const实参(非const引用,只能接受非const实参
int sum(int &v1, int &v2) { return v1 + v2;}int main() { int a = 10; int b = 20; sum(10, 20); // 报错,因为引用的v1和v2不能传常量值 // 将引用&去掉就符合规则,但是在某些传入参数必须是引用的情况下,如果仍然需要传常量 // 就可以改为常引用 // int sum(const int &v1, const int &v2) sum(a, b);}
-
可以跟非const引用构成重载
int sum(int &v1, int &v2) { return v1 + v2;}int sum(const int &v1, const int &v2) { return v1 + v2;}
编译器会认为这是两个不同的函数。
如果引用&换成指针*效果一样。
-
-
分析:
-
int * const p = &age
表示指针变量p不能修改指向,可以利用指针变量p间接修改所指向的变量:*p还是可以改变值,即改变的是age的值。
-
int const *p = &age
表示不可以利用指针变量p间接修改所指向的变量,但指针变量p可以修改指向
再回到引用:
-
int & const ref = age
表示 ref 不能修改指向,但可以利用ref间接修改所指向的变量但 ref 来就不能修改指向,所以加不加 const 都一样
-
int const &ref = age
表示 ref 可以修改指向,但不能利用ref间接修改所指向的变量但 ref 本就不能修改指向,所以加上 const 后表示 ref 不能间接修改指向变量的值
-