C++的“引用”是条寄生虫

在C++中,引用(reference)是一个已存在变量的别名(alias)。比如鲁讯原名周树人,前者就是后者的别名。

一、引用的用法

定义引用时需要用到&,用法如下:

int ival = 9527;

int &refVal = ival; // refVal指代ival,是ival的另一个名字

二、引用的注意事项

引用是对象的第二个名字,像个寄生虫一样寄生在原名之上,因此定义时必须要与原名(某个已存在的变量)绑定,下面的定义是错误的:

int &refVal; // 错误:引用在定义时必须要初始化

寄生虫有个特点,离开宿主就会完蛋。求生的欲望把引用打造成一个特别忠贞的孩子:一旦绑定,终身不改,再也不能换对象。从这个特性可以推断出,引用内部的实现应该是一个常量指针。

前面的int &refVal = ival;用C语言表示相当于:

const int *refVal = &ival;

三、引用的主要用途

在功能上,引用和指针(pointer)比较相像,主要用于函数参数传递。普通的变量是以“传值”的方式传递参数,需要将实参的值复制给形参,在函数中改变的是形参,而不是赋值给形参的实参。这就像我盖了一个和我的房子一模一样房子送给你,这个工程量是很大的,而且你装修是你的房子。

指针以“传址”的方式传递参数,传过去的是地址,在函数中是能改变实参的。这就像我把我房子的地址告诉你,你按地址找到我家,装修的是我的房子。

引用是以“传名”的方式传递参数,传过去的是变量的名字,在函数中也是能改变实参的。这就像我把我的房子的名字告诉你,你一样能找到我的房子。

引用在内部实现上也是用了指针的,但是用引用会更方便(语法层面,引用不需要用&获取地址,也不需用*访问数据)。就像你打车去找福尔摩斯,如果说去贝克街221号,司机可能要反应一会儿,但如果直接说去福尔摩斯家,它可能立马反应出他家的位置(但不一定知道是贝克街221号)。

用最经典的“交换两个变量”来验证三种传递参数方式的区别:

#include<iostream>
using namespace std;

//普通变量:传值版
void swap1(int a, int b){
    int t=a;
    a=b;
    b=t;
}

//指针:传址版
void swap2(int *a, int *b){
    int t=*a;
    *a=*b;
    *b=t;
}

//引用:传名版
void swap3(int &a, int &b){
    int t=a;
    a=b;
    b=t;
}

int main(){
    //普通变量:传值版
    int a=3, b=9;
    swap1(a, b);
    printf("%d %d\n", a, b);

    //指针:传址版
    a=3, b=9;
    swap2(&a, &b);
    printf("%d %d\n", a, b);

    //引用:传名版
    a=3, b=9;
    swap3(a, b);
    printf("%d %d\n", a, b);

    return 0;
}

输出结果:

显而易见,引用能用实现指针的功能,但用起来比指针方便得多。

四、引用与指针的区别

引用的寄生性决定了与指针的区别

①引用在声明时必须初始化,而指针不必。

②引用一旦初始化,就不能再指向其他对象,而指针可以随时改变它所指向的对象。

③不存在空引用,但存在空指针。

④引用一旦初始化,就可以像普通变量一样使用,不需要使操作符*访问数据,指针在访问所指向的对象时需要使用操作符*。

相关推荐

  1. C++ 中引用

    2024-06-08 12:04:04       41 阅读
  2. c++中引用(&)

    2024-06-08 12:04:04       33 阅读
  3. C++中引用

    2024-06-08 12:04:04       32 阅读
  4. C++中引用

    2024-06-08 12:04:04       19 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-06-08 12:04:04       19 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-08 12:04:04       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-08 12:04:04       20 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-08 12:04:04       20 阅读

热门阅读

  1. C++ 实现Python 列表list 的两种方法

    2024-06-08 12:04:04       8 阅读
  2. flutter 解析json另类封装方式 List<bean>,哈哈哈

    2024-06-08 12:04:04       8 阅读
  3. Linux学习之查看文件内容

    2024-06-08 12:04:04       12 阅读
  4. linux-磁盘空间显示指令

    2024-06-08 12:04:04       9 阅读
  5. 基于截图和模拟点击的自动化压测工具开发(MFC)

    2024-06-08 12:04:04       8 阅读
  6. Git - 创建和应用patch

    2024-06-08 12:04:04       10 阅读
  7. 自动化喷涂生产线方案三

    2024-06-08 12:04:04       10 阅读
  8. 【每日一函数】uname 函数介绍及代码演示

    2024-06-08 12:04:04       8 阅读
  9. vue2 computed 、watch --vue3 computed 、watch

    2024-06-08 12:04:04       8 阅读
  10. jQuery:一站式指南

    2024-06-08 12:04:04       9 阅读