zoukankan      html  css  js  c++  java
  • C++ 中的值传递和引用传递

    本文主要介绍C++中的 值传递(pass-by-value) 和 引用传递(pass-by-reference) 的区别。

    1 pass-by-value

    在 C++ 里面,一个函数在使用参数时,如果使用 pass-by-value 方式,那么编译系统会在调用该函数的地方, 把实参复制一份传给函数的形参 

    用法示例:int FunA(string strTest);

    这种做法有以下几个问题:

    1. 第一,如果在函数里修改传给函数的参数值,实际上我们修改的只是 实参的副本 ,而在调用函数的位置,这个 实参值 本身没有改变;
    2. 第二,此过程中进行的副本拷贝动作会耗费系统的资源,如果拷贝的参数是比较复杂的 struct 或者 class 等类型,复制出一份副本的成本(时空开销)很大;

    2 pass-by-reference

    在 C++ 里面,一个函数在使用参数时,如果使用 pass-by-reference 方式,那么编译系统会在调用该函数的地方, 直接将实参的内存地址(指针)传给形参 

    用法示例:int FunA(string & strTest);

    这种做法有以下几点好处:

    1. 第一,由于函数的参数传递的是把实参的地址拷贝给形参,因此形参和实参对应的是同一块内存地址,所以对形参的修改自然会反映到实参上;
    2. 第二,在 C++ 中,指针的地址是一个 int 类型,说以即使在 64 位系统中,指针地址的复制成本(8字节)也是可以接受的;
    3. 第三,因为 C++ 规定引用不能为空,所以在函数中传进来引用可以直接使用,雅思报考而如果传进来的是指针类型(实际上是值传递、引用传递之外的指针传递方式),那么还需要先判断指针是否为空,易用性不强。

    3 总结

    综合对比上述两种函数参数的值传递方式,可以看出在C++中, 一般情况下 都会优先使用“引用传递”。

    例如:

                         int FunA(const string strTest)  // 值传递
    {
        // some code
    }
    
    int FunB(const string & strTest)    // 引用传递,这里加了const关键字,为常引用。优选
    {
        // some code
    }  
  • 相关阅读:
    java环境配置
    关于Chrome(谷歌浏览器)对docume,准确获取网页客户区的宽高、滚动条宽高、滚动条Left和Top
    CSS3圆角详解
    Js监控回车事件
    Sql日期时间格式转换
    JS操作JSON总结
    SQL日期操作及只获取日期的方法
    如何让div出现滚动条
    CodeForces 55D Beautiful numbers
    POJ 3034 Whac-a-Mole
  • 原文地址:https://www.cnblogs.com/huilixieqi/p/13749868.html
Copyright © 2011-2022 走看看