| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> C++知识库 -> C++之引用 -> 正文阅读 |
|
[C++知识库]C++之引用 |
工具为了解决问题而创造出来,不要为了制造工具而制造工具。 目录 概念引用(reference)就是C++对C语言的重要扩充,C++在C++1.0版本中添加了引用等一系列概念。
引用的定义方法如上。
引用的特性
引用的常见用法引用作为函数返回值引用类型是可以作为函数返回值的,但是它其中涉及到的部分要素容易被忽略,导致程序出错。
如以上代码示例中, 如果运行,在编译器中可能不会报错,但是会有一个警告: ?这意味着我们函数返回的空间可能是非法的。 当我们将 ret 的引用作为返回值返回给主函数时,ret 所占用的空间在编译器中已经成为了无主的地盘了。如果我们在 add 函数执行之后再加上其它的内容,就可能将 r 引用空间再次占用,导致报错。
由此我们也可以得到引用类型作为函数返回值的要求:
引用作为参数在C++中,参数传递的方式有两种:传值与传引用。 传值是我们都熟悉的,函数的形参是实参的一个拷贝,函数在执行过程中,形参的改变不会影响到实参。 传引用的传参方式下,形参是对应实参的引用,而引用的一大特性在于:对引用的操作与对实体的操作完全一致。即,通过传引用的方式传入参数,我们对形参的修改就等同于对实参的修改。
?结果是显而易见的,单纯的传值是无法完成我们预期的交换功能的,而传引用却可以。 这是因为传值传入的形参本质是实参的拷贝,两者的地址并不相同,对形参的操作自然无法影响到实参。 而传引用传入的引用是实参的别名,形参实参二者使用的是同一块地址空间,对形参的操作自然也就可以对实参造成影响。 我们之前在C语言中绝大多数使用一级指针的地方搜可以使用引用代替,同理,大多数使用二级指针的地方可以使用一级指针的引用代替。 常引用
?
常引用引用不同类型的变量。?
? 可见,以上代码并没有发生报错,并且还成功运行了起来,但是这次对于实体的修改并没有影响到实体的常引用。 通过对代码运行时的进一步分析可以得到: ?变量实体与其常引用的地址并不相同。所以,对变量实体的修改与常引用并没有关系。 在对 double 类型变量 d 进行常引用时,因为变量类型并不相同,编译器便会创建一个 int 类型的临时变量用来存储 double 类型变量的整型部分的数据,然后将临时变量给常引用作为实体。 同时,由于临时空间是编译器创建的,用户无法知道空间的名字以及地址,所以用户无法修改临时空间中的内容,所以该空间具有常性,所以可以使用 const 类型的变量来引用。 引用的效率我们可以通过令程序多次重复调用满足某些条件的函数,计算第一次开始调用到最后一次调用完毕之间的时间间隔,通过比较得出传值,传引用;普通返回值,引用作为返回值的效率关系。
运行结果:?? ?可见传引用的效率明显高于传值,引用作为返回值的效率明显高于普通返回值 引用与指针
? ?由以上代码部分反汇编可以看出,从汇编指令的角度来看,对指针与引用在底层的实现与相关操作是完全一致的。即,从底层实现方式上:指针与引用的实现方法是一样的,即引用在底层是按照指针的方式来实现的。 而在概念层面,为了方便使用者的理解,C++将引用解释为:引用是一个别名,与其被引用的实体公用一分内存空间,编译器不会给引用变量分配新的内存空间。 所以,引用实际上是有空间的,空间中的内容是引用实体的地址。 T& 可以看作是 T * const 类型的指针。 指针与引用的区别
|
|
C++知识库 最新文章 |
【C++】友元、嵌套类、异常、RTTI、类型转换 |
通讯录的思路与实现(C语言) |
C++PrimerPlus 第七章 函数-C++的编程模块( |
Problem C: 算法9-9~9-12:平衡二叉树的基本 |
MSVC C++ UTF-8编程 |
C++进阶 多态原理 |
简单string类c++实现 |
我的年度总结 |
【C语言】以深厚地基筑伟岸高楼-基础篇(六 |
c语言常见错误合集 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 0:04:41- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |