zoukankan      html  css  js  c++  java
  • LinuxC/C++基础——引用

    1.引用(Reference)

    1.1引用的基本语法

    引用是C++对C的重要扩充,也存在与其他一些编程语言中,并不是C++的发明。通过引用,C++增加了

    另外一种给函数传递地址的途径,这就是按引用传递(pass-by-reference)

    引用就是已定义变量的别名

    void test01(){
    
        int a = 10;
        //给变量a取一个别名b,语法:Type& ref = val;
        int& b = a;
        cout << "a:" << a << endl;
        cout << "b:" << b << endl;
        cout << "------------" << endl;
        //操作b就相当于操作a本身
        b = 100;
        cout << "a:" << a << endl;
        cout << "b:" << b << endl;
        cout << "------------" << endl;
        //一个变量可以有n个别名
        int& c = a;
        c = 200;
        cout << "a:" << a << endl;
        cout << "b:" << b << endl;
        cout << "c:" << c << endl;
        cout << "------------" << endl;
        //a,b,c的地址都是相同的
        cout << "a:" << &a << endl;
        cout << "b:" << &b << endl;
        cout << "c:" << &c << endl;
    }

     

     使用引用的注意事项

    void test02(){
        //1) 引用必须初始化
        //int& ref; //报错:必须初始化引用
        //2) 引用一旦初始化,不能改变引用
        int a = 10;
        int b = 20;
        int& ref = a;
        ref = b; //不能改变引用
        //3) 不能对数组建立引用
        int arr[10];
        //int& ref3[10] = arr;
    }

     1.2函数中的引用

    最常见引用的地方实在函数的参数和返回值中。当引用被用作函数参数的时候,在函数内对任何引用的修改,将对函数外的参数

    产生改变。相对比指针,引用具有更加清晰的语法。

    void ValueSwap(int m,int n){
        int temp = m;
        m = n;
        n = temp;
    }
    //地址传递
    void PointerSwap(int* m,int* n){
        int temp = *m;
        *m = *n;
        *n = temp;
    }
    //引用传递
    void ReferenceSwap(int& m,int& n){
        int temp = m;
        m = n;
        n = temp;
    }
    void test(){
        int a = 10;
        int b = 20;
        //值传递
        ValueSwap(a, b);
        cout << "a:" << a << " b:" << b << endl;
        //地址传递
        PointerSwap(&a, &b);
        cout << "a:" << a << " b:" << b << endl;
        //引用传递
        ReferenceSwap(a, b);
        cout << "a:" << a << " b:" << b << endl;
    }

     

    1.3引用的本质

    引用的本质在C++内部实现时一个指针常量(指针常量中,指针自身的值是一个常量,不可改变,始终指向同一个地址。在定义的同时必须初始化)

    //发现是引用,转换为 int* const ref = &a;
    void testFunc(int& ref){
        ref = 100; // ref是引用,转换为*ref = 100
    }
    int main(){
        int a = 10;
        int& aRef = a; //自动转换为 int* const aRef = &a;这也能说明引用为什么必须初始化
        aRef = 20; //内部发现aRef是引用,自动帮我们转换为: *aRef = 20;
        cout << "a:" << a << endl;
        cout << "aRef:" << aRef << endl;
        testFunc(a);
        return EXIT_SUCCESS;
    }

     1.4指针的引用

    1.5常量引用

    void test01(){
        int a = 100;
        const int& aRef = a; //此时aRef就是a
        //aRef = 200; 不能通过aRef的值
        a = 100; //OK
        cout << "a:" << a << endl;
        cout << "aRef:" << aRef << endl;
    }
    void test02(){
        //不能把一个字面量赋给引用
        //int& ref = 100;
        //但是可以把一个字面量赋给常引用
        const int& ref = 100; //int temp = 200; const int& ret = temp;
    }
        [const引用使用场景]
        常量引用主要用在函数的形参,尤其是类的拷贝/复制构造函数。
    将函数的形参定义为常量引用的好处:
       引用不产生新的变量,减少形参与实参传递时的开销。
       由于引用可能导致实参随形参改变而改变,将其定义为常量引用可以消除这种副作用。
       如果希望实参随着形参的改变而改变,那么使用一般的引用,如果不希望实参随着形参改变,那么使用常引用。

    j

    知识的二道贩子,此博客仅仅是个人学习总结!
  • 相关阅读:
    《计算学科系统导论》系列路线图
    “知行合一”的高职计算机教学观
    文化的概念
    关于班级博客地址
    一个字符编码处理小程序(一)
    关于计应151/152《软件工程》课程实践的安排
    人人都要学一点系统论
    我与软件工程
    关于本人与本博客
    THUWC前集训9
  • 原文地址:https://www.cnblogs.com/xiangdongBig1/p/12064517.html
Copyright © 2011-2022 走看看