zoukankan      html  css  js  c++  java
  • 引用详解

    专业的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

  • 相关阅读:
    【C/C++】习题3-4 周期串/算法竞赛入门经典/数组和字符串
    【C/C++】习题3-3 数数字/算法竞赛入门经典/数组和字符串
    【科研】科研【合同】盖章流程/横向&#183;非涉密/电子科技大学
    【C/C++】习题3-2 分子量/算法竞赛入门经典/字符串
    【C/C++】习题3-1 得分/算法竞赛入门经典
    【C/C++】例题3-6 环状序列/算法竞赛入门经典/数组和字符串
    【C/C++】字符数组:char,char*,char a[], char *a[], char **s 的区别与联系/const char*和char*的区别
    requirements.txt的创建及使用
    Vue packages version mismatch版本问题的解决
    linux后台运行程序--nobup
  • 原文地址:https://www.cnblogs.com/boost/p/10347667.html
Copyright © 2011-2022 走看看