zoukankan      html  css  js  c++  java
  • C++学习之路(二):引用

    (1)引用是变量的别名

    引用的基本定义格式:类型 &引用名 = 变量名

    例如:int a = 1; int &b = a,这里b是a的别名,b与a都指向了同一块内存单元。

    对于引用而言,其底层实现是通过const指针的方式实现的。相较于c,引用是c++引入的一种更为方便的表示方式。

    引用不是一种变量,其仅仅是变量的别名;

    引用没有自己独立的内存空间,引用需要与其引用的变量共享内存空间;

    对引用所做的改变实际上是会影响到对应的变量;

    引用在定义时需要进行初始化,一旦引用被初始化后,其不能够被重新指向其他变量。

    (2)const引用

    const引用是指向const对象的引用。

    例子:

    const int a = 100;

    const int &b = a;   //正确,引用b为const类型,可以作为const变量a的别名

    int &c = a; //错误,c为普通引用,不可以作为const变量a的别名,因为对于c而言,可以对c所引用的变量进行修改(例如c += 1),但a为const变量,不能够被修改。

    (3)按引用进行传递

    引用传递的方式是在函数形参中加入引用描述符&。如swap(int &a, int &)

    值传递:swap(int a, int b)。形参将根据实参生成新的内存单元,作用域仅在当前函数栈帧内,函数结束后数据弹栈。故不能够对实参进行修改;

    指针传递:swap(int *a, int *b)。形参传入的是变量的地址,在当前函数栈帧中对地址中的数据进行修改,函数结束后数据弹栈,但实参对应地址中的数据已经被修改。但指针传递的方式

    可能会使程序难以阅读,c语言没有引用特性时采用指针传递的方式较多;

    引用传递:swap(int &a, int &b)。对形参的任何操作都能够改变相应的实参的数据,相较于指针传递方式而言,程序较为方便。

    (4)引用作为函数返回值

    例子:

    int &add(int a, int b)
    {
        int sum;
        sum = a + b;
        return sum;
    }
    
    int main(void)
    {
        int n = add(3, 4);
        int &n2 = add(5, 6);
        cout << "n2=" << n2 << endl;
        cout << "n=" << n << endl;
        cout << "n2= "<<n2<<endl; 
        return 0;
    }

    main函数中,add函数返回sum的引用,n为普通变量,n2为引用(引用的是原理sum拥有的内存区域)。上述结果程序可能输出如下:

    n2 = 11

    n = 7

    n2 = 1474313670

    原因为:n为普通变量,拥有独立的内存区域,它接收返回时sum所属区域的值,多次打印n的值都为7。但对于n2而言,其自身是一个引用,sum所在的内存区域在函数返回后弹栈就清空,

    该块内存变为dirty,之后很可能被覆盖了其他不确定的值,所以每次打印都可能不是一个定值。

    上述程序也可能在运行时崩溃,不打印输出任何结果。

    结论:不能够返回对局部变量的引用,否则程序极有可能崩溃。

    (5)指针和引用

    引用访问是对变量的直接访问,指针保存的是变量的地址,对变量是间接访问;

    引用是变量的别名,本身不单独分配独立的内存空间,但指针有自己的内存空间;

    引用需在声明时进行初始化,并且在初始化完成后不能再指向其他变量,但指针可以;

  • 相关阅读:
    多时钟系统3 Crossing clock domains Task
    多时钟系统2 Crossing clock domains Flag
    多时钟系统4 Crossing clock domains Data bus
    sytem.h
    TDA2003功放电路
    windows ddk
    关于DSP的一些基本知识和用法(资料来源于合众达网页)
    [FPGA][NiosII]内置LCD控制器使用心得(转)
    FPGA pins
    DSP2407配置步骤
  • 原文地址:https://www.cnblogs.com/scu-cjx/p/8573354.html
Copyright © 2011-2022 走看看