• 从c到c++<三>


    • 引用是给一个变量起别名
      回顾下变量,它有这两个属性:名称和空间。而引用不是变量,它仅仅只是变量的别名,没有自己的独立空间,需要与它所引用的变量共享空间,所以对于引用所做的改变实际上是对它所引用的变量的改变。
    • 定义引用的一般格式:


      下面用程序来说明下:

      编译:

      由上面的输出结果可以得出结论:定义引用时一定要初始化,指明该引用变量是谁的别名。
      所以修改程序如下:

      这时编译就正常了,下面给它进行赋值:

      编译运行:



      这如何来解释呢?“引用一经初始化,就不能重新再指向其它变量了”,所以:

    • 在实际应用中,引用一般用作参数传递与返回值【关于这点,在后面一点进行说明】

     

    下面用程序来验证一下:

    思考一下,为什么C++不允许非const引用指向const变量呢?原因很简单,如果允许的话,那可以这样写:

    下面如果是这种情况呢?

    实际上是跟上一步的相反,那这能编译通过么?

    也就是常量引用能指向变量,那能通过引用来更改变量的值么?

    这个也很容易理解,只要是常量都不能进行更改。

    下面来输出一下值:

    可以看出,ref4精度确实丢失了,而我们知道引用是跟变量共享空间的,那应该值也是一样的呀,这个结果不相违背了么,实际上并没有违背,原因如下:

    说了这么多跟const引用相关的知识点,其实最常用的也就是它不能再赋值。

     在c语言中形参传递分为值传递和指针传递,前者是形参不能更改实参,而后者是能做到形参更改实参的,而这个引用传递也能做到更改实参,下面来介绍下它:

    下面用一个两数交换的例子来说明下引用作为形参的写法:

    #include <iostream>
    using namespace std;
    void swap(int &x, int &y);
    int main(){
    int a, b;
    a = 10;
    b = 20;
    swap(a, b);
    cout<<"a="<<a<<"b="<<b<<endl;
    return 0;
    }
    void swap(int &x, int &y){
    int temp;
    temp = x;
    x = y;
    y = temp;
    }

    程序运行结果如下:

    而其中引用的初始化是在参数调用中进行的:

    而能实现数值交换的根本原来是由于引用共享变量的空间,对引用的更改也就是对变量的更改。

    •  引用的另一个作用是用于返回引用的函数。
    • 函数返回引用的一个主要目的是可以将函数放在赋值运算符的左边。
      下面用程序来实验一下:

      程序输出:

      这个输出结果也是由于引用的作用,该引用是在函数返回的时候进行初始化,而index(3)在函数返回的时候将其引用初始化了a[3],所以对index(3)做的改变实际上也就是对a[3]做的改变,所以就这是为什么是这个结果的原因。

    【注意】:不能返回对局部变量的引用,下面也用程序进行说明:

    编译运行:

    乍看好像很正常,但是:

    这时再来看结果:

    这是为什么呢?

    这是因为:

    • 引用访问一个变量是直接访问,而指针是间接访问。
    • 引用是一个变量的别名,本身不单独分配自己的内存空间,而指针有自己的内存空间。
    • 引用一经初始化不能再引用其它变量,而指针可以。
    • 尽可能使用引用,不得已时使用指针。
      这是由于:
      值传递:实参要初始化形参数需要分配空间,将实参内容拷贝到形参。
      引用传递:实参初始化形参数时不分配空间。
      指针传递:本质是传递,实参初始化形参的时候,也是要分配空间的,分配的是4字节的空间(32位系统),如果我们要修改指针的地址,单纯用指针传递也是不行的,需要用指针的指针(**)或引用指针(*&)。
  • 相关阅读:
    Redis——发布/订阅
    Redis——任务队列
    GOF设计模式——Builder模式
    GOF设计模式——Prototype模式
    GOF设计模式——Singleton模式
    shell 脚本中的数学计算表达
    shell $'somestring'
    shell if-elif-elif-fi
    vim 使用
    疑问:为什么要使用href=”javascript:void(0);”?
  • 原文地址:https://www.cnblogs.com/webor2006/p/4870361.html
Copyright © 2020-2023  润新知