none
c++的函数返回类型中的引用返回与传统机制返回有什么不同啊? RRS feed

  • 问题

  • 大一学生学习c++比较不懂请求给位老师解答!

    《c++primer plus》对此的解释个人理解为就是将程序运行速度加快,占用更少的内存。就仅仅是这样吗?有其他的影响吗?

    2018年1月12日 7:59

全部回复

  • 避免copy开销。
    2018年1月12日 8:34
  • 你好,

    建议你可以参考这篇文章:

    http://blog.csdn.net/luoshenfu001/article/details/8601494

    从概念上讲。指针从本质上讲就是存放变量地址的一个变量,在逻辑上是独立的,它可以被改变,包括其所指向的地址的改变和其指向的地址中所存放的数据的改变。

    而引用是一个别名,它在逻辑上不是独立的,它的存在具有依附性,所以引用必须在一开始就被初始化,而且其引用的对象在其整个生命周期中是不能被改变的(自始至终只能依附于同一个变量)。

    在C++中,指针和引用经常用于函数的参数传递,然而,指针传递参数和引用传递参数是有本质上的不同的:

    指针传递参数本质上是值传递的方式,它所传递的是一个地址值。值传递过程中,被调函数的形式参数作为被调函数的局部变量处理,即在栈中开辟了内存空间以存放由主调函数放进来的实参的值,从而成为了实参的一个副本。值传递的特点是被调函数对形式参数的任何操作都是作为局部变量进行,不会影响主调函数的实参变量的值。

    而在引用传递过程中,被调函数的形式参数虽然也作为局部变量在栈中开辟了内存空间,但是这时存放的是由主调函数放进来的实参变量的地址(指针传递参数时,指针中存放的也是实参的地址,但是在被调函数内部指针存放的内容可以被改变,即可能改变指向的实参,所以并不安全,而引用则不同,它引用的对象的地址一旦赋予,则不能改变)。被调函数对形参的任何操作都被处理成间接寻址,即通过栈中存放的地址访问主调函数中的实参变量。正因为如此,被调函数对形参做的任何操作都影响了主调函数中的实参变量。

    引用传递和指针传递是不同的,虽然它们都是在被调函数栈空间上的一个局部变量,但是任何对于引用参数的处理都会通过一个间接寻址的方式操作到主调函数中的相关变量。而对于指针传递的参数,如果改变被调函数中的指针地址,它将影响不到主调函数的相关变量。如果想通过指针参数传递来改变主调函数中的相关变量,那就得使用指向指针的指针,或者指针引用。 即指针传递只是传了一个地址copy, 在函数内部改变形参所指向的地址,不能改变原实参指向的地址,仅可以通过修改形参地址的内容,来达到修改实参内容的目的(原C语言中的通过指针来互换值小函数例子),所以如果想通过被调函数来修改原实参的地址或给重新分配一个对象都是不能完成的,只能使用双指针或指针引用(下面会进行详解)。

    为了进一步加深大家对指针和引用的区别,下面我从编译的角度来阐述它们之间的区别:

    程序在编译时分别将指针和引用添加到符号表上,符号表上记录的是变量名及变量所对应地址。指针变量在符号表上对应的地址值为指针变量的地址值,而引用在符号表上对应的地址值为引用对象的地址值。符号表生成后就不会再改,因此指针可以改变其指向的对象(指针变量中的值可以改),而引用对象则不能修改。



    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    • 已建议为答案 Lee Liu 2018年4月24日 5:41
    2018年1月16日 6:58
  • 你好,

    在C++中,引用的本质实际上就是指针常量,指针所占的资源是很少的,比如在64位的系统下,指针只占8个字节。通过指针寻址,去找到所指向的类的实例并做一些操作,而不用直接将整个类的实例返回,这样可以大大提高性能和占用更少的内存空间。正如 Greateway 所说,就是避免copy的性能开销。


    Please remember to mark the replies as answers if they helped. If you have feedback for TechNet Subscriber Support, contact tnsf@microsoft.com.


    Click here to learn more. Visit the dedicated forum to share, explore and talk to experts about Microsoft Teams.

    2018年4月24日 5:47
  • 大一学生学习c++比较不懂请求给位老师解答!

    《c++primer plus》对此的解释个人理解为就是将程序运行速度加快,占用更少的内存。就仅仅是这样吗?有其他的影响吗?

    你学了c/c++的指针/引用之类的你就很清楚了。。。

    引用的话,函数体对引用对象的变更会影响到外部传进来的函数.

    比方说

    int iValue=0;

    void MyfunctionForRef(ref int intArgument)  //使用引用 。
    {

    //好久没写cpp了,如果cpp用引用的话应该大概是写成 MyfunctionForRef(int& intArgument)?

        intArgument=intArgument+1

    }

    void Myfunction( int intArg)
    {
        intArg=intArg+1;
    }

    int main(...) //main函数。
    {

       int a=0;

       Myfunction(a);

       //此时a=0,函数体对a的变更没影响。
       MyfunctionForRef(ref a);//忘了cpp引用怎么写了,懒得查。

       //此时 a=1;//函数体内对a+1;

    }

    好久没写cpp了,y语法用了c#的。。。明白就好。。

    ------------------------------------------

    引用的好处是,你效率更高,不用构造复制一个参数对象(特别是你的函数的参数如果是个对象的话),占用内存更少。

    坏处是,没搞好的话,可能会有很多潜在的bug(比方说,你使用引用的函数,被一个菜鸟使用,菜鸟不清楚引用会对传入的参数发生变更,然后就搞来搞去。。。然后就bug失控了,而且还不知道问题出在哪里)。微软再有代码涉及引用(C#)的话,会警告其安全性。

    但是用的好的话,特别是涉及比较大的对象的话,在可控范围内,我觉得用一下引用也不错。。



    2018年6月7日 3:29