zoukankan      html  css  js  c++  java
  • c++之引用

    什么是引用?
    引用:给数据起别名

    格式:数据类型 数据名 = &数据名;

    #include <iostream>
    using namespace std;
    
    int main() {
        int a = 10;
        int &b = a;
        cout << "a的值是:" << a<<endl;
        cout << "b的值是:" << b << endl;
        a = 11;
        cout << "a的值是:" << a << endl;
        cout << "b的值是:" << b << endl;
        b = 12;
        cout << "a的值是:" << a << endl;
        cout << "b的值是:" << b << endl;
        system("pause");
        return 0;
    }

    输出:

    b引用a,b和a指向相同的内存地址, 所以当其中一个变化,另一个的值也会进行相应的变化。

    注意事项:

    • 引用必须初始化;
      int &b;//错误,没被初始化
    • 引用在初始化之后就不能够被改变了;
      int a = 10;
      int &b = a;
      int c = 20;
      b = c;//这里就是错误的。

    引用做函数的参数:

    作用:参数传递时,可以通过引用的技术让形参修饰实参。

    优点:简化指针修改实参。

    #include <iostream>
    using namespace std;
    
    //值传递
    void swap1(int a, int b) {
        int tmp = a;
        a = b;
        b = tmp;
    }
    //地址传递
    void swap2(int* a, int* b) {
        int tmp = *a;
        *a = *b;
        *b = tmp;
    }
    //引用传递,形参可以修饰实参
    //也就是&a,&b是a,b的别名
    void swap3(int &a, int &b) {
        int tmp = a;
        a = b;
        b = tmp;
    }
    
    int main() {
        int a = 10;
        int b = 20;
        cout << "a的值是:" << a<<endl;
        cout << "b的值是:" << b << endl;
        swap1(a, b);
        cout << "swap1之后a的值是:" << a << endl;
        cout << "swap1之后b的值是:" << b << endl;
        swap2(&a, &b);
        cout << "swap2之后a的值是:" << a << endl;
        cout << "swap2之后b的值是:" << b << endl;
        swap3(a, b);
        cout << "swap3之后a的值是:" << a << endl;
        cout << "swap3之后b的值是:" << b << endl;
        system("pause");
        return 0;
    }

    输出:

    不难发现,地址传递和引用传递均可以通过形参的改变而影响实参的值。

    引用做函数的返回值:

    #include<iostream>
    using namespace std;
    
    //不能返回局部变量的引用
    int& func() {
        int a = 10;
        return a;
    }
    
    //函数的调用可以作为左值
    int& func2() {
        //静态变量,在所有程序结束后才释放
        static int a = 10;
        return a;
    }
    int main() {
        int& res = func2();
    
    
        cout << res << endl;
        cout << res << endl;
        func2() = 100;
        //相当于都是变量a的引用
        cout << res << endl;
        cout << res << endl;
        system("pause");
        return 0;
    
    }

    输出:

    一句话来说就是:一荣俱荣,一损俱损。 

    引用的本质:

    本质:引用的本质在C++内部实现实际上是一个指针常量

    #include<iostream>
    using namespace std;
    
    //发现是引用,转换为int* const ref = &a;
    void func(int &ref) {
        ref = 100;//ref是引用,转换为*ref=100;
    }
    
    int main() {
        int a = 10;
        //自动转换成int* const ref = &a;指针常量是指向不可以更改,值可以更改
        int& ref = a;
        ref = 20;//内部发现ref是引用,自动转换成*ref=20;
        cout << "a="<<a << endl;
        cout <<"ref="<< ref << endl;
        func(a);
        cout << "a=" << a << endl;
        cout << "ref=" << ref << endl;
        system("pause");
        return 0;
    
    }

    输出:

    常量引用:

    作用:用来修饰形参,防止误操作。

    void func(const int &tmp) {
        //tmp= 100;不合法了
    }
    
    nt a = 10;
    const int* ref = a;//不合法,必须是引用一段合法的内存空间
    const int* ref2 = 10;//合法
  • 相关阅读:
    VIM 文本对象选择
    XLA优化实例
    TVM/Relay 的 PartitionGraph()(mod) 函数讨论整理
    OpenCL通用异构开放环境
    LLVM IR 理解
    vue——请求跨域时,vcli2/vcli3设置代理
    【转】SQL 21天实战练习
    bash命令
    linux命令
    jenkins技术
  • 原文地址:https://www.cnblogs.com/xiximayou/p/12084762.html
Copyright © 2011-2022 走看看