美文网首页C/CPLUS
一文搞懂C++引用的好处

一文搞懂C++引用的好处

作者: LabVIEW_Python | 来源:发表于2022-01-30 11:10 被阅读0次

    与C语言的指针相比,C++的应用在实现层面上保留了指针的高效,又在软件工程层面提高了程序的可读性和可维护性参考《Reference(引用) vs Pointer(指针) in C++》

    第一步:创建引用。

    #include<iostream>
    
    using namespace std;
    
    int main()
    {
        int i = 100;
        int& r = i;  //引用在创建时,必须被初始化;一旦初始化就不能更改引用对象
        int* p = &i;  //指针在创建时,可以初始化,可以不初始化;可以更改指向的对象
    
        cout << "i is: " << i << ";" << "i's reference is: " << r << endl;
        r = r - 10;
        *p = *p - 10;
        i = i - 10;
        cout << "i is: " << i << ";" << "i's reference is: " << r << endl;
    
        return 0;
    }
    

    从反汇编语言中可以看到:

    • 引用和指针的本质都是地址,初始化和减法操作的汇编代码一模一样
    • 引用在语法上,更加易读易懂;指针即专门存放地址的变量,所以初始化时,必须要用变量的地址来赋值。
    引用vs指针的初始化 引用vs指针的操作

    第二步:用引用传参,其好处是:

    • 函数形参和实参是同一个对象,也就不存在对象复制,减少了开销。
    • 可以在修改形参的同时对实参的修改。
    #include<iostream>
    
    using namespace std;
    void swap(int a, int b)
    {
        int tmp = b;
        b = a;
        a = tmp;
    }
    void swap_by_ref(int& a, int& b)
    {
        int tmp = b;
        b = a;
        a = tmp;
    }
    void swap_by_pointer(int* a, int* b)
    {
        int tmp = *b;
        *b = *a;
        *a = tmp;
    }
    int main()
    {
        int a = 100;
        int b = 50;
    
        cout << "Initial value" << endl;
        cout << "a: " << a << ";" << "b: " << b << endl;
        
        cout << "excute the swap(a, b)" << endl;
        swap(a, b);
        cout << "a: " << a << ";" << "b: " << b << endl;
    
        cout << "excute the swap_by_ref(a, b)" << endl;
        swap_by_ref(a, b);
        cout << "a: " << a << ";" << "b: " << b << endl;
    
        cout << "excute the swap_by_pointer(&a, &b)" << endl;
        swap_by_pointer(&a, &b);
        cout << "a: " << a << ";" << "b: " << b << endl;
    
        return 0;
    }
    
    传形参不能实现对实参的修改
    调用比较 汇编实现比较 引用vs指针实现比较
    第三步:把引用作为函数返回值,注意不能引用局部变量,因为局部变量离开自己的作用域后,会被自动销毁。
    完毕

    相关文章

      网友评论

        本文标题:一文搞懂C++引用的好处

        本文链接:https://www.haomeiwen.com/subject/sreqkrtx.html