0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

c++引用详细解说2

jf_78858299 来源:阿Q正砖 作者:阿Q正砖 2023-02-15 09:43 次阅读

5、应用

  1. 参数

我们知道实参的改变不影响形参,所以这种写法并不能改变值,因为此刻是 传值调用 :

图片

按照之前 c 的写法,我们使用 传址调用 ,用指针修改:

图片

但是学习引用之后,完全可以用引用修改:

图片

x 和 y 分别是 a 和 b 的引用,对 x 和 y 进行修改,就是对 a 和 b 进行修改,所以值也被修改成功了。

调试一下:

它们的地址是完全相同的。而这里这里既不是传值调用,也不是传址调用,而是传引用调用。

思考:上面三个函数是否构成函数重载?构成,但无法调用。

根据函数名修饰规则,传值和传引用的是不一样的,比如会加上 R 做区分。

但是不能同时调用传值和传引用,因为有歧义,就会导致调用不明确 ,编译器并不知道调用哪个:

图片

引用解决二级指针生涩难懂的问题 :

讲单链表时,我们写的由于是没有头结点的链表,所以修改时,需要二级指针,对于指针概念不清晰的小伙伴们可能比较难理解。

但是学了引用,就可以解决这个问题:

结构定义:

typedef structSListNode{            int data;            struct SListNode* next;}SLTNode;

原代码:

void SListPushFront(SLTNode** pphead, SLTDateType x){    SLTNode* newnode = BuyListNode(x);    newnode->next = *pphead;     *pphead = newnode;}// 调用SLTNode* pilst = NULL;SListPushFront(&plist);

修改后:

void SListPushFront(SLTNode*& pphead, SLTDateType x) // 改{            SLTNode* newnode = BuyListNode(x);            newnode->next = *pphead;             *pphead = newnode;}// 调用SLTNode* pilst = NULL;SListPushFront(plist); // 改

修改之后的代码里的二级指针被替换成了引用。

而这里的意思就是给一级指针取了一个别名,传过来的是plist,而plist 是一个一级指针,所以会出现 * ,而这里就相当于 pphead 是 plist 的别名。而这里修改 pphead ,也就可以对 plist 完成修改。

但是有时候也会这么写 :

结构改造:

typedef structSListNode{            int data;            struct SListNode* next;}SLTNode, *PSLTNode;

这里的意思就是将 struct SListNode* 类型重命名为 PSLTNode

代码:

void SListPushFront(PSLTNode& pphead, SLTDateType x) // 改{            PSLTNode newnode = BuyListNode(x);            newnode->next = pphead;             pphead = newnode;}// 调用 PSLTNode plist = NULL;SListPushFront(plist);

typedef 之后,PSLTNode 就是结构体指针,所以传参过去,只需要在形参那边用引用接收,随后进行操作,就可以达成目的。

而形参的改变影响实参的参数叫做输出型参数,对于输出型参数,使用引用就十分舒适。

如果了解引用,那么这一部分是相当好理解的,一些数据结构教科书上也是这么写的,但是如果不懂引用,甚至会觉得比二级指针还难以理解。

在我们学习了引用之后,之后也可以这么写代码,更加方便。

  1. 做返回值

要搞清楚这一块,我们先进行些许铺垫。

int add(int a, int b){            int c = a + b;            return c;}
int main(){ int ret = add(1, 2); cout << ret << endl; return 0;}

这里看似很简单,就是把add函数计算结束的结果返回,但是这里包含了 传值返回 。

若从栈帧角度看,会先创建 main 函数的栈帧,里面就会有 call 指令,开始调用 add 函数。而 add 函数也会形成栈帧,而栈帧中也有两块小空间,用来接受参数,分别为 a 和 b,而里面的 c 则用来计算结果并返回。

图片

而对于传值返回,返回的并不是 c ,而是返回的是 c 的拷贝。而这其中会有一个临时变量,返回的是临时变量(见函数栈帧)

如果返回的是 c 的话,由于 add 的函数栈帧已经销毁了,就会产生很多奇怪的问题。c 能不能取到都是未知,而这时都是非法访问,因为空间已经被归还给系统了,所以必定是c拷贝后的数据被返回。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • C语言
    +关注

    关注

    180

    文章

    7551

    浏览量

    131928
  • C++
    C++
    +关注

    关注

    21

    文章

    2070

    浏览量

    73039
  • 面向对象
    +关注

    关注

    0

    文章

    64

    浏览量

    9936
收藏 人收藏

    评论

    相关推荐

    如何在MDK中使用C++,整理的经验

    一:C++引用C文件注意:C++文件能引用C文件,但是C
    发表于 03-10 15:32

    新手必备嵌入式学习步骤及方法详细解说

      新手必备嵌入式学习步骤及方法详细解说?嵌入式系统的应用非常广泛,因此对于计算机专业、电子信息专业、自动化专业以及机电一体化等专业的学生以及需要掌握嵌人式的人员来说,学习嵌入式系统及其开发应用是
    发表于 06-22 13:35

    详细讲解C++串口的相关知识

    大家可以先参考一下这篇blog,C++串口通信里面详细讲解了C++串口的相关知识,以及一些函数的讲解。下面我也会根据他的blog再讲解。二、实现过程1、打开串口:使用函数:HANDLE CreateFile();HANDLE C
    发表于 08-24 06:56

    IDF.PY编译时提示找不到iostream的原因?怎么才能正常引用iostream这些c++的标准库啊?

    failed with exit code 1我在工程里引用了一个C++的库,里面用了iostream, 在一个C++的.h头文件开头。c++类库我确认都在idf的对应目录下,包括i
    发表于 02-16 06:58

    请问ESP32+Eclipse如何添加C++生成得静态库(.a)如何引用

    ESP32在Eclipse下如何添加C++生成得静态库(.a)如何引用
    发表于 02-20 08:33

    开关电源原理及各功能电路详细解说

    开关电源原理及各功能电路详细解说
    发表于 09-15 17:19 42次下载
    开关电源原理及各功能电路<b class='flag-5'>详细</b><b class='flag-5'>解说</b>

    C++程序设计教程之数组的详细资料说明

    本文档详细介绍的是C++程序设计教程之数组的详细资料说明主要内容包括了:1. 数组的概念,2. 一维数组的定义和引用,3. 二维数组的定义和引用
    发表于 03-14 14:48 10次下载
    <b class='flag-5'>C++</b>程序设计教程之数组的<b class='flag-5'>详细</b>资料说明

    C++引用的使用场景

    C++引用的使用场景
    的头像 发表于 06-29 15:18 3873次阅读
    <b class='flag-5'>C++</b>:<b class='flag-5'>引用</b>的使用场景

    C++中的const和引用的讨论

    今天给大家分享一下这段时间学习c++的总结学习:c++里面的const关键字和引用
    的头像 发表于 12-24 15:35 692次阅读

    C++基础语法中的引用、封装和多态

    本期是C++基础语法分享的第六节,今天给大家来分享一下: (1)引用; (2)宏; (3)成员初始化列表; (4)封装; (5)继承; (6)多态; 引用 左值引用 常规
    的头像 发表于 09-12 09:58 1188次阅读

    c++引用详细解说1

    C++是C语言的继承,它可进行过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行以继承和多态为特点的面向对象的程序设计。
    的头像 发表于 02-15 09:40 427次阅读
    <b class='flag-5'>c++</b><b class='flag-5'>引用</b><b class='flag-5'>详细</b><b class='flag-5'>解说</b>1

    c++引用详细解说3

    C++是C语言的继承,它可进行过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行以继承和多态为特点的面向对象的程序设计。
    的头像 发表于 02-15 09:43 392次阅读
    <b class='flag-5'>c++</b><b class='flag-5'>引用</b><b class='flag-5'>详细</b><b class='flag-5'>解说</b>3

    c++引用详细解说4

    C++是C语言的继承,它可进行过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行以继承和多态为特点的面向对象的程序设计。
    的头像 发表于 02-15 09:43 371次阅读
    <b class='flag-5'>c++</b><b class='flag-5'>引用</b><b class='flag-5'>详细</b><b class='flag-5'>解说</b>4

    C++引用和指针

    之前的文章我们已经介绍了C++中的基本类型如int,bool和double等,除了基本类型C++还有一些更复杂的数据类型复合类型,所谓的复合类型就是通过其他类型定义的类型,本篇文章我们将会着重介绍C++的复合类型
    的头像 发表于 03-17 14:00 476次阅读

    详细解说pcb板表面绝缘层

    详细解说pcb板表面绝缘层
    的头像 发表于 09-28 09:55 2378次阅读