• 为什么 C++ 有指针了还要引用?


    今天师弟问我,引用的底层也是指针实现的,内置类型指针传递和引用传递的汇编代码是一样的,那C++为什么还需要引入引用呢?
    好吧,仔细想了下,这确实是个好问题。
    引用传递,只是明面上,没有使用值传递,值传递本身是不可避免的。
    编译器,暗地里通过指针(或者其他可以替代指针的数据类型)的值传递,替换了引用传递。
    所以引用传递,实质上是地址传递,别名这东西只是概念,是一种抽象,别名是没法传递的。
    别名,可不是真实的数据类型。
    因为,函数传递参数需要,数据复制,所以明的暗的值传递,不可避免。
    引用的高效,在于对大的数据,不用直接的复制数据。

    引用能实现的基本上指针都可以实现,那为什么C++还需要引入引用呢?下面看看C++之父Bjarne Stroustrup是怎么说的吧:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    真相大白,原来C++引用的引入是为了支持运算符重载。顺便提一句,既然C++引入了引用,那为什么C++不和Java一样抛弃指针呢?答:为了兼容C语言。

    补充一点引用带来的好处:
    用指针的使用经常犯得错:1,操作空指针,2,操作野指针,3,不知不觉改变了指针的值,而后还以为该指针正常。如果我们要正确的使用指针,我们不得不人为地保证这三个条件。而引用的提出就解决了这个问题。
    引用区别于指针的特性是 :1,不存在空引用(保证不操作空指针),2,必须初始化(保证不是野指针),3,一个引用永远指向他初始化的那个对象(保证指针值不变)。人为保证变为了编译器来保证,更加安全。

    用户自定义的类型最好用引用传参,这样可以避免不必要的构造函数和析构函数调用,但是对于像int,long,char一类的内置类型,按值传参会比按引用传参更高效。(https://www.tanglei.name/blog/pass-by-value-when-using-c-like-parameter-is-better-than-pass-by-referene.html)

    结论:内置类型建议按值传参,用户自定义类型建议按引用参数。

    参考资料:《C++语言的设计和演化(Bjarne Stroustrup著)》

  • 相关阅读:
    iOS 键盘类型定制归纳
    CocoaPods安装第三方出错:XCode7.3
    NSIntger CGFloat NSNumber
    iOS 关于使用xib创建cell的两种初始化方式
    自定义导航栏--用法一
    CocoaPods的安装[转载]
    pch和info.plist初探
    iOS_XCode7_Launch Image 的初使用
    nginx四层负载及动静分离
    Nginx负载均衡
  • 原文地址:https://www.cnblogs.com/a3192048/p/12241280.html
Copyright © 2020-2023  润新知