• 引用详解


    专业的C++代码会用到大量的引用,在C++中引用是变量的别名,所有对引用的修改都会改变被引用变量的值,可以将引用当作隐私指针,这个指针没有取变量地址和解除引用的麻烦(也可以将引用当作是原始变量的别名)。

    一. 引用变量

    1.引用变量在创建的时候必须初始化

    int a = 0;
    int &b = a;    //work
    std::cout << "b:" << b << std::endl; 
        
    //int &c = 0;   //error
    const int &c = 0;  //work

    值得注意的是:不能对创建引用直接“值传递”,除非这是一个const引用;

    引用总是引用当初初始化的那个变量,一旦创建就无法修改变量,但是可以修改变量的值,比如:

    int x = 1,y = 2;
        int &xRef = x,&yRef = y;
        std::cout << "X : " << xRef << std::endl;
        std::cout << "y : " << yRef << std::endl;
        
        //X : 1
        //y : 2
        
        xRef = &y;        //error    

    为什么错误呢?

    因为xRef是int&,而y得地址是一个指针。所以两者而无法赋值。

    如果将一个引用赋值给另一个引用呢?

        xRef = yRef;            
        
        std::cout << "X : " << xRef << std::endl;
        std::cout << "y : " << yRef << std::endl;

    结果是:

    X : 2
    y : 2

    看出这里只是将y的值传递给xRef(也就是x),但是XRef还是x得引用。

     2.指针的引用和指向引用的指针

    int *a;
        int *&aRef = a;    //指向int的指针的引用 
        aRef = new int;
        *aRef = 100;
        
        std::cout << "a :"  << *a << std::endl;
        
        int b;
        int &bRef = b;
        int *p = &bRef;    //指向b引用的地址 
        *p = 10;
        std::cout << "b :"  << b << std::endl;

    结果是:

    a :100
    b :10

    3.引用参数

    引用通常作为函数或则方法的参数。默认的参数传递机制是按值传递。

    引用传递相对按值传递的优点有:

    1.效率:复制较大的对象或则结构需要较长的时间,引用传递只是把指向对象或则结构的指针传递给函数。

    2.正确性:并非所有的对象都支持按值传递,即使支持按值传递也不能像deep copy那样。

    4.引用作为返回值

    引用作为返回值的主要原因是提高效率,返回引用而不是返回整个对象这样可以避免被不必要的复制。

    #include <iostream>
    
    /* run this program using the console pauser or add your own getch, system("pause") or input loop */
    
    void swapValue(int a,int b)
    {
        int temp = a;
        a = b;
        b = temp;
    }
    
    void swapvalue(int &a,int &b)
    {
        int temp = a;
        a = b;
        b = temp;
    }
    int main(int argc, char** argv)
    {
        int a = 1,b = 2;
        int c = 3,d = 4;
        std::cout << "a : " << a << "    "
        << "b :" << b << std::endl;
            
        std::cout << "c : " << c << "    "
        << "d :" << d << std::endl;
        
        std::cout << "swapValue :" << std::endl;
        swapValue(a,b);
        std::cout << "a : " << a << "    "
        << "b :" << b << std::endl;
        std::cout << "swapvalue :" << std::endl;
        swapvalue(c,d);
        std::cout << "c : " << c << "    "
        << "d :" << d << std::endl;
        
        
        return 0;
    }

    结果是:

    a : 1 b :2
    c : 3 d :4
    swapValue :
    a : 1 b :2
    swapvalue :
    c : 4 d :3

  • 相关阅读:
    IOptions、IOptionsMonitor、IOptionsSnapshot的区别
    基于 .NET 的 FluentValidation 验证教程
    挂载NFS网络文件系统教程
    gcc简要知识点
    二叉树遍历(前序、中序、后序、层次、广度优先、深度优先遍历)
    项目管理的一些知识总结
    Vue从零开发单页应用程序项目
    CRC校验原理
    Linux 文件搜索神器 find 实战详解
    Linux 三剑客之 grep、sed、awk 使用详解
  • 原文地址:https://www.cnblogs.com/boost/p/10347667.html
Copyright © 2020-2023  润新知