• C++零基础教程(引用)



    前言

    本篇文章我们来讲解C++中非常重要的一个概念,这个概念就是引用,引用在C++中经常使用,下面就让我们来看看到底什么是引用吧。

    一、引用概念介绍及使用方法

    在C++中,引用是一种别名,它允许我们使用一个已经存在的对象来创建一个新的名称。引用提供了一种更直观、简洁和安全的方式来操作对象,同时也增加了代码的可读性。

    以下是关于C++中引用的一些重要特点和用法:

    1.引用的声明和初始化:

    引用必须在声明时进行初始化,并指定它所引用的对象,否则会导致编译错误。
    引用初始化后,一旦绑定到一个对象,就不能再改变其绑定的对象。

    int num = 10;
    int& ref = num;  // 引用声明和初始化
    
    • 1
    • 2

    2.引用与所引用的对象绑定:

    引用与所引用的对象始终保持绑定关系,它们指向同一片内存空间,对引用的修改会影响到所引用的对象,反之亦然。
    引用不拥有独立的内存地址,它仅是所引用对象的一个别名。

    int num = 10;
    int& ref = num;
    
    ref = 20;  // 修改引用的值
    cout << num;  // 输出 20
    
    • 1
    • 2
    • 3
    • 4
    • 5

    3.引用作为函数参数:

    引用可以作为函数的参数传递,允许在函数内部直接操作外部对象,避免了拷贝和内存消耗。
    通过传递引用,函数可以修改外部对象的值,这种方式称为引用传递。

    void modifyValue(int& ref) {
        ref += 10;
    }
    
    int num = 5;
    modifyValue(num);  // 传递引用
    cout << num;  // 输出 15
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    二、引用与指针的区别

    指针(Pointer)和引用(Reference)是在C++中常用的两种变量类型,它们具有不同的特点和用法,下面是它们之间的区别:

    1.内存操作:

    指针可以通过指针运算和解引用来直接操作内存地址,可以改变所指向的对象的值,也可以指向空地址(nullptr)。
    引用是对象的一个别名,没有自己的独立内存地址,它和所引用的对象始终绑定在一起,不能改变引用所绑定的对象。

    2.初始化与赋值:

    指针可以没有初始化,也可以为空指针(nullptr)初始化,可以在后续进行赋值操作。
    引用必须在声明时进行初始化,并一直绑定到同一个对象,不能绑定到其他对象。

    3.空值(Nullability):

    指针可以指向空地址(nullptr),表示指针未指向任何有效的对象。
    引用不能为空,必须引用一个有效的对象。

    4.重新指向:

    指针可以通过重新赋值来指向其他对象或空地址。
    引用一经引用绑定,就无法改变所引用的对象。

    5.数组操作:

    指针可以进行指针算术运算,可以指向数组的不同元素,并能通过指针访问数组元素。
    引用不能直接绑定到数组,但可以通过指针间接操作数组。

    6.参数传递:

    指针可以用作函数参数,可以传递指针的地址或指向对象的指针,通过指针在函数内部修改外部对象的值。
    引用也可以用作函数参数,将参数声明为引用类型,可以直接操作参数所引用的外部对象,更加简洁直观。
    总的来说,指针提供了更多的灵活性和直接的内存操作能力,适合需要进行动态内存分配、操作数组或者追踪空值的场景。引用则更加简洁和安全,适合作为参数传递,避免了指针空值和误操作的问题。选择使用指针还是引用取决于具体的使用场景和需求。

    示例:

    int num = 10;
    int& ref = num;  // 引用
    int* ptr = &num;  // 指针
    
    ref = 20;
    *ptr = 30;
    
    cout << num;  // 输出 30
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    三、引用常用代码示例

    1.引用作为函数参数传递:
    引用经常用于函数参数传递,允许函数直接修改传递的对象,避免了对象的拷贝。例如:

    void swap(int& a, int& b) {
        int temp = a;
        a = b;
        b = temp;
    }
    
    int x = 5;
    int y = 10;
    swap(x, y);
    
    cout << x << " " << y;  // 输出 10 5
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    2.引用用于遍历容器元素:
    引用可以用于遍历容器中的元素,以更简洁和直观的方式访问和修改容器中的值。例如:

    vector<int> numbers = {1, 2, 3, 4, 5};
    
    for (int& num : numbers) {
        num *= 2;
    }
    
    for (int num : numbers) {
        cout << num << " ";  // 输出 2 4 6 8 10
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    3.引用用于操作符重载:
    引用常用于重载操作符,允许在自定义类型上使用像赋值操作符、下标操作符等常见的操作。例如:

    class MyArray {
    private:
        int data[5];
    
    public:
        int& operator[](int index) {
            return data[index];
        }
    };
    
    MyArray arr;
    arr[2] = 10;
    cout << arr[2];  // 输出 10
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    4.引用用于返回值优化:
    引用还可以用于函数的返回值优化(Return Value Optimization,RVO),允许函数直接返回一个对象而不进行拷贝,提高执行效率。例如:

    vector<int> createVector() {
        vector<int> temp = {1, 2, 3, 4, 5};
        return temp;
    }
    
    vector<int>& getVector() {
        static vector<int> temp = {1, 2, 3, 4, 5};
        return temp;
    }
    
    vector<int> numbers1 = createVector();  // 返回临时对象的拷贝
    vector<int>& numbers2 = getVector();    // 直接引用静态对象
    
    numbers1.push_back(6);  // 对 numbers1 的修改不会影响原始对象
    numbers2.push_back(6);  // 对 numbers2 的修改会影响原始对象
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    以上示例展示了引用的主要用途,包括函数参数、容器操作、操作符重载和返回值优化。引用的使用可以提高代码的可读性、避免拷贝开销,并在操作对象时提供便利的方式。

    总结

    本篇文章主要讲解了引用的使用,及引用和指针的区别。

  • 相关阅读:
    都是同样条件的mysql select语句,为什么读到的内容却不一样?
    Java-异常
    【音视频-FFMPEG相关命令使用】
    为什么Redis集群的最大槽数是16384个?
    2022年湖北省科技计划项目“包干制”管理申报条件以及流程
    【MySQL高级篇】一文带你吃透数据库和表的操作之DDL|实战案例详解
    el-date-picker 有效时间精确到时分秒 且给有效时间添加标记
    面试官:如何提升应用的 Lighthouse 分数
    MSQL系列(六) Mysql实战-SQL语句优化
    Java 11及更高版本的Oracle JDK版本
  • 原文地址:https://blog.csdn.net/m0_49476241/article/details/131418952