0
点赞
收藏
分享

微信扫一扫

【C++】 引用 Reference

zibianqu 2022-01-23 阅读 84

引用 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
    • 不存在引用的引用、引用数组

  • 存在的价值:

    1. 比指针更安全

      因为指针可以随意修改指向,所以就可能指向不该指的地方。

      引用初始化时必须指向一个变量,不会说指向某个未知的内存。

    2. 函数返回值可以被赋值

  • 引用常用的场景

    • 函数传参引用

**问:不是说引用是从一而终嘛?**

每一次调用函数都会重新创建一个变量,每次创建的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 不能间接修改指向变量的值

举报

相关推荐

0 条评论