• 【C++漂流记】简易理解引用的基本语法和使用及其注意实现


    引用是C++中的一种数据类型,它允许我们使用一个已经存在的变量来创建一个新的名称或别名,以便可以通过这个别名来访问和修改原始变量的值。引用的本质是一个别名或者一个变量的别名。
    在这里插入图片描述


    基本语法

    C++中的引用是一个别名,它允许我们使用一个已经存在的变量来创建一个新的引用变量。引用在声明时必须初始化,并且一旦初始化后,就不能再引用其他变量。

    引用的基本语法如下:

    type &ref = variable;
    
    • 1

    其中,type是引用的类型,ref是引用变量的名称,variable是已经存在的变量。

    示例代码:

    #include 
    
    int main() {
        int num = 10;
        int &ref = num;  // 创建一个整型引用ref,引用变量num
    
        std::cout << "num: " << num << std::endl;  // 输出:num: 10
        std::cout << "ref: " << ref << std::endl;  // 输出:ref: 10
    
        ref = 20;  // 修改引用变量ref的值,也会修改num的值
    
        std::cout << "num: " << num << std::endl;  // 输出:num: 20
        std::cout << "ref: " << ref << std::endl;  // 输出:ref: 20
    
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    在上述示例中,我们创建了一个整型变量num,并使用引用ref来引用它。当我们修改引用变量ref的值时,也会修改num的值。因此,最后输出的num和ref的值都是20。

    需要注意的是,引用只是一个别名,它并不占用额外的内存空间,只是指向了已经存在的变量。引用在函数传递参数、函数返回值、避免拷贝大对象等场景中非常有用。


    引用的注意事项

    1. 引用必须在声明时进行初始化:引用在声明时必须初始化,并且一旦初始化后,就不能再引用其他变量。例如,int &ref; 是错误的,必须写成 int &ref = num;

    2. 引用不能引用临时变量:引用不能引用临时变量,即不能将引用绑定到一个临时对象上。例如,int &ref = 5; 是错误的。

    3. 引用不能改变绑定的变量:一旦引用绑定了某个变量,就不能再改变绑定的变量。例如,int num1 = 10; int num2 = 20; int &ref = num1; ref = num2; 这段代码不是将num1的值改为num2的值,而是将num1的值改为20。

    4. 引用作为函数参数时的注意事项:当引用作为函数参数传递时,函数内部对引用的修改会影响到原始变量。这可以用来实现函数的返回多个值或者修改传入的参数的效果。但需要注意,如果函数参数是引用类型,传入的参数必须是一个可修改的左值,而不能是一个常量或者临时变量。

    5. 引用作为函数返回值时的注意事项:引用可以作为函数的返回值,但需要注意返回的引用不能指向局部变量,因为局部变量在函数返回后会被销毁。如果返回一个引用,应该确保返回的是一个静态变量、全局变量、或者是通过new运算符在堆上分配的内存。


    引用做函数参数

    1. 通过引用参数返回多个值:当函数需要返回多个值时,可以使用引用参数。通过引用参数,函数可以将计算结果直接存储到传入的参数中,而不需要使用函数返回值。这样可以避免创建临时变量或者使用指针来传递结果。

    例如,下面的函数通过引用参数返回两个整数的和与差:

    void calculateSumAndDifference(int a, int b, int& sum, int& difference) {
        sum = a + b;
        difference = a - b;
    }
    
    int main() {
        int num1 = 10;
        int num2 = 5;
        int sum, difference;
    
        calculateSumAndDifference(num1, num2, sum, difference);
    
        std::cout << "Sum: " << sum << std::endl;  // 输出:Sum: 15
        std::cout << "Difference: " << difference << std::endl;  // 输出:Difference: 5
    
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    1. 通过引用参数修改传入的变量:通过引用参数,函数可以修改传入的变量的值。这样可以避免使用指针来传递变量的地址,并且可以直接在函数内部修改传入的变量。

    例如,下面的函数通过引用参数将传入的整数变量加倍:

    void doubleNumber(int& num) {
        num *= 2;
    }
    
    int main() {
        int num = 10;
    
        doubleNumber(num);
    
        std::cout << "Doubled number: " << num << std::endl;  // 输出:Doubled number: 20
    
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    需要注意的是,当引用作为函数参数时,传入的参数必须是一个可修改的左值,而不能是一个常量或者临时变量。因为引用需要绑定到一个已经存在的变量上。如果传入的参数是常量或者临时变量,可以使用const引用参数来接收,以避免对其进行修改。

    void printValue(const int& num) {
        std::cout << "Value: " << num << std::endl;
    }
    
    int main() {
        int num = 10;
    
        printValue(num);  // 输出:Value: 10
        printValue(20);  // 输出:Value: 20
    
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    在上述示例中,printValue函数接收一个const引用参数,即使传入的参数是常量或者临时变量,也可以通过const引用来访问其值,但不能修改其值。


    引用的本质

    引用的本质是一个别名或者一个变量的别名。引用是C++中的一种数据类型,它允许我们使用一个已经存在的变量来创建一个新的名称或别名,以便可以通过这个别名来访问和修改原始变量的值。

    在内部实现上,引用通常是通过指针来实现的,但是在使用引用时,我们无需关注指针的细节,可以像使用原始变量一样使用引用。编译器会自动处理引用的底层指针操作。

    引用的本质可以通过以下几个特点来理解:

    1. 引用必须在声明时进行初始化,并且一旦初始化后,就不能再改变其绑定的变量。这意味着引用始终指向同一个变量,不能重新绑定到其他变量。

    2. 引用与其绑定的变量共享同一块内存空间,它们指向同一个地址。因此,通过引用可以直接访问和修改绑定的变量的值。

    3. 引用在使用时可以像普通变量一样进行操作,包括赋值、传递给函数、作为函数的返回值等。

    4. 引用可以作为函数参数传递,可以用于实现函数的返回多个值或者修改传入的参数的效果。


    常量引用

    常量引用是指通过引用来绑定到一个常量对象上的引用。常量引用在声明时使用关键字const来修饰引用类型,表示引用的对象是一个常量,不能被修改。

    常量引用的主要特点是:

    1. 常量引用可以绑定到常量对象或者非常量对象上,但是不能通过常量引用来修改被引用的对象的值。

    2. 常量引用可以用于函数参数,以避免在函数中对传入的参数进行修改。

    3. 常量引用可以接收常量对象、非常量对象和临时对象。

    下面是一些常量引用的示例:

    void printValue(const int& num) {
        std::cout << "Value: " << num << std::endl;
    }
    
    int main() {
        int num1 = 10;
        const int num2 = 20;
    
        printValue(num1);  // 输出:Value: 10
        printValue(num2);  // 输出:Value: 20
        printValue(30);    // 输出:Value: 30
    
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    在上述示例中,printValue函数接收一个常量引用参数,可以接收常量对象、非常量对象和临时对象。由于参数是常量引用,函数内部不能修改传入的参数的值。

    常量引用在函数参数中的使用可以避免对传入的参数进行修改,同时还可以提高程序的性能,因为常量引用不需要创建临时副本。此外,常量引用还可以用于避免不必要的拷贝操作,提高程序的效率。

  • 相关阅读:
    redis运维(十四) hash缓存案例
    零数科技创新金融案例入选《2022全球区块链创新应用示范案例集》
    express multiparty minio实现图片的上传
    docker上面部署nginx-waf 防火墙“modsecurity”,使用CRS规则,搭建WEB应用防火墙
    专利非正常申请,需要我们注意什么
    基于ssm的校运会管理系统设计与实现-计算机毕业设计源码+LW文档
    MySQL是如何实现事务的隔离级别
    JWT简单介绍
    云IDE----效率时代的大杀器
    python中的贪心算法-求顾客的最小的等待时间
  • 原文地址:https://blog.csdn.net/Goforyouqp/article/details/132735871