【C++技能树】原来比C方便这么多 --引用、内联函数、Auto、NULL与nullptr

news2024/9/21 13:13:28

 

Halo,这里是Ppeua。平时主要更新C语言,C++,数据结构算法......感兴趣就关注我吧!你定不会失望。

🌈个人主页:主页链接

🌈算法专栏:专栏链接

     我会一直往里填充内容哒!

🌈LeetCode专栏:专栏链接 

    目前在刷初级算法的LeetBook 。若每日一题当中有力所能及的题目,也会当天做完发出

🌈代码仓库:Gitee链接

🌈点击关注=收获更多优质内容🌈

目录

1.引用:

1.1引用的特性(使用规则):

1.2使用场景:

1.22返回值为引用对象:

1.3引用的权限:

1.4引用与指针的差别:

2.auto:

2.1 新式for循环:

3.NULL与nullptr:

4.内联函数:

完结撒花:

 

1.引用:

上一篇章已经介绍了一部分的引用内容,这一个部分我们再来完善一下我们的知识架构.

1.1引用的特性(使用规则):

引用必须在声明部分给出定义,不能单单申明.需要指定对象

int &b;这样就是错的

1.2使用场景:

1.21参数为引用对象:

我们之前写swap时,想要交换这两个值往往需要取其指针参数.之后通过改变指针指向的内容来交换

例如这样

void swap(int *pa,int *pb)
{
    int tmp=0;
    tmp=*pa;
    *pa=*pb;
    *pb=tmp;
}

但学会引用后我们可以这样写.

void swap(int &pa,int &pb)
{
    int tmp=0;
    tmp=pa;
    pa=pb;
    pb=tmp;
}

 相当于对传入的参数取了一个别名,实际的操作仍然是对实参进行操作.

这就是引用的场景之一:做形参,这样可以减少程序运行时数据的拷贝.因为在函数中,形参是对实参的临时拷贝.若这个实参数据量很大,则会对程序的运行造成较大的印象.

1.22返回值为引用对象:

先说结论,这样做也可以减少程序运行时数据的拷贝,但还有更方便的操作!

先说使用方法:

int &add(int &a,int &b)
{
    static int c=a+b;
    return c;
}
int main()
{
    int a=1,b=2;
    int c=add(a,b);
    cout<<c;
}

 接下来,我们来分析下这个程序.

返回的值为引用,所以在主函数中c的是对add函数中的c的一个别名.

为什么这里要加入static呢?可不可以这样写?

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

答案显然是不行的,在深刻理解函数栈帧之后就可以轻松的明白为什么这样写不可以.

这是函数调用时的栈帧模型.

当函数调用结束.若该数据放在局部区域,则会被释放 

 

此时Main中的c仍然在对其进行引用,但其内容已经被释放.所以不可以这么写. 

所以一定要创建一个全局变量来存储返回的值.

1.3引用的权限:

    //权限平移
    int a=10;
    int &b=a;

在这串代码中,b与引用对象a的权限都为int ,所以是正常的代码

    //权限升级
    const int c=10;
    int &d=c;
    const int &dc=c;
 

在这串代码中,引用对象为只读对象,可以读不可以写,而d想要写只读对象,显然出错了

    //降级
    int e=10;
    const int &f=e;

在这段代码中,引用对象为可读可写,而f只想读这个数据,显然是可以的

    //权限降级
    //临时变量创建临时空间的问题
    double g=10;
    int &h=g;
    const int &i=g;

在这段代码中,h为int类型 想去引用double的对象,任何不同类型间的相互转换都会先创建出一个临时变量

 类似这样,所以a对b来说并没有权限去修改b里的值,因为即使是修改也只能修改到tmp里的值,所以要写成只读的引用方式.

1.4引用与指针的差别:

其实非常的简单,

引用是对这块区域取一个别名,也就像大熊猫和panda的区别,他们都代表同一种生物.

而指针就像是在动物园里有一个房子上面写着熊猫住址,这时候你可以通过这个房子去找到熊猫.但房子本身也是一种属性.

其yc与c1共用一块地址空间,而pc中存着他们的地址,且pc有一个自己的空间, 

    //引用和指针的区别
    int c1=10;
    int *pc=&c1;
    int &yc=c1;
    cout<<&yc<<endl;
    cout<<&pc;

 输出结果为

他们概念上的差别:(凭理解记忆即可) 

1. 引用概念上定义一个变量的别名,指针存储一个变量地址。
2. 引用在定义时必须初始化,指针没有要求
3. 引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何一个同类型实体
4. 没有NULL引用,但有NULL指针
5. 在sizeof中含义不同:引用结果为引用类型的大小,但指针始终是地址空间所占字节个数(32位平台下占4个字节)
6. 引用自加即引用的实体增加1,指针自加即指针向后偏移一个类型的大小
7. 有多级指针,但是没有多级引用
8. 访问实体方式不同,指针需要显式解引用,引用编译器自己处理
9. 引用比指针使用起来相对更安全

2.auto:

在c中要想声明一个函数,则只能通过写定义类型来声明.

但在c++中提供了一个auto关键字类型,它可以通过后文来推断这个变量是什么类型.在编译期间会被替换为对应的类型.

这样的代码是错误的,因为auto所有类型必须保持一致.

auto a=1,b=2,c=1.1;

因为其是通过后文来推断这个变量是什么类型的,所以用auto时一定要有后文,这样也同样是错的.

auto b;

 auto不能用来直接声明数组,也不能用来作为函数参数.

2.1 新式for循环:

在c中想要遍历一个数组只能通过以下方式

void TestFor()
{
    int array[] = { 1, 2, 3, 4, 5 };
    for (int i = 0; i < sizeof(array) / sizeof(array[0]); ++i)
        array[i] *= 2;
    for (int* p = array; p < array + sizeof(array)/ sizeof(array[0]); ++p)
        cout << *p << endl;
}

而在c++中可以直接使用auto来遍历. 

void TestFor()
{
    int array[] = { 1, 2, 3, 4, 5 };
    for(auto& e : array)
        e *= 2;
    for(auto e : array)
        cout << e << " ";
    return 0;
}

 其中&表示引用,可以对array中的数组进行修改.

3.NULL与nullptr:

在c语言当中,所有指针都被定义为NULL,但是NULL的定义为0或者为(void*)0.

0的优先级更高,所以输出了以下的结果.

 在c++中引入了nullptr的概念,其定义就为(void*)0

4.内联函数:

 在讲内联函数之前,我们先来复习下写一个Max的宏函数怎么写.

#define MAX(a, b) ((a) > (b) ? (a) : (b))

这段代码需要注意a,b之间的替换,因为define是在预编译阶段就进行了复制转换,可能会产生一些歧义.

在C++中,改进了这一个方法,引入了内联函数的机制.

在一个函数前加上inline即可

inline int max(int a, int b)
{
	return a > b?a : b;
}
int main()
{
	cout << max(3, 5);
}

就能达到和宏同样的效果.其适用于短小且频繁调用的函数. 但是inline对编译器来说仅为建议,编译器会自己判断是否采用这种方式,若代码过长则会采用函数方式.

内联函数因为并不会产生地址,所以在头文件当中要声明与定义写在一起.

完结撒花:

🌈本篇博客的内容【原来比C方便这么多 --引用、内联函数、Auto、NULL与nullptr】已经结束。

🌈若对你有些许帮助,可以点赞、关注、评论支持下博主,你的支持将是我前进路上最大的动力。

🌈若以上内容有任何问题,欢迎在评论区指出。若对以上内容有任何不解,都可私信评论询问。

🌈诸君,山顶见!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/456642.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【软考备战·希赛网每日一练】2023年4月24日

文章目录 一、今日成绩二、错题总结第一题第二题第三题第四题第五题 三、知识查缺 题目及解析来源&#xff1a;2023年04月24日软件设计师每日一练 一、今日成绩 二、错题总结 第一题 解析&#xff1a; 第二题 解析&#xff1a; DPI表示每英寸像素点的个数。 300DPI表示每英寸…

ESP32学习六-构建系统

一、简介 如果想要新建一个ESP32项目&#xff0c;需要包含很多其他的文件夹和文件&#xff0c;如果对ESP32的勾线系统原理不理解&#xff0c;就会产生出很多编译不通过的问题。这里就对ESP-IDF构建系统的实现原理做一个简单的总结。 测试环境&#xff1a;Ubuntu18.4 ESP-IDF&am…

Observability:添加免费和开放的 Elastic APM 作为 Elastic 可观察性部署的一部分 - 8.x

作者&#xff1a;David Hope 在最近的一篇博文中&#xff0c;我们向你展示了如何开始使用 Elastic 可观察性的免费开放层。 下面&#xff0c;我们将介绍你需要做些什么来扩展你的部署&#xff0c;这样你就可以开始免费从应用程序性能监控&#xff08;APM&#xff09;或跟踪集群…

我国直播电商行业市场增速下降 核心竞争力发生转变 新一轮洗牌变革步伐将加快

1、直播电商概念及其产业链图解 直播电商是属于网络直播的一个分支&#xff0c;属于一种泛娱乐类直播&#xff0c;电商店铺的店家或模特主播在直播间通过借助视频录制工具&#xff0c;将店铺所售的商品展示给用户&#xff0c;并为用户答疑解惑&#xff0c;提供实时的客服服务&…

【JavaEE初阶】多线程(二)线程状态以及多线程安全问题

摄影分享~~ 文章目录 线程的状态多线程带来的风险线程安全线程安全的原因解决线程不安全问题&#xff08;加锁&#xff09;synchronized关键字-监视器锁monitor locksynchronized的特性 java中的死锁问题死锁死锁的三个典型情况死锁的四个必要条件如何避免死锁&#xff1f; J…

家用洗地机怎么选?2023高性价比家用洗地机推荐

相信大家和我一样是妥妥的“懒人一族”了&#xff0c;不喜欢做家务、不喜欢碰脏水、不喜欢花费过多的时间在家务上&#xff0c;但是却想有一个整洁干净的家居环境。而作为家务清洁中面积最大、耗时耗力最多的就是扫地拖地了。传统的地面清洁方式&#xff0c;要先用扫把扫一遍&a…

Git上传本地代码到Github

参考 https://zhuanlan.zhihu.com/p/138305054 文章目录 上传本地代码到github仓库&#xff08;1&#xff09;创建一个空文件夹&#xff0c;在该文件夹下右键&#xff0c;Git bash here&#xff08;2&#xff09;初始化仓库&#xff08;3&#xff09; 建立本地与github上项目的…

ChatGPT 速通手册——让 ChatGPT 来写正则表达式

regex 生成 正则表达式可谓是一门让广大程序员们又爱又恨的技术。它易学难精&#xff0c;而且可维护性又差&#xff0c;别说交接给其他同事&#xff0c;同一个人写的正则表达式&#xff0c;三个月后回头再看&#xff0c;也可能完全不知所云。 因此&#xff0c;让 ChatGPT 来写…

【计网 从头自己构建协议】一、libpcap 介绍 手撕以太网帧

上一篇&#xff1a;IndexError: list index out of range 下一篇&#xff1a;[【计网 从头自己构建协议】二、收发 ARP 请求帧与响应帧] 介绍 理论的学习总是枯燥的&#xff0c;想要加深对理论的理解&#xff0c;最好的方法就是自己实践一遍。 想要亲手实现各种协议&#xf…

通讯方式连接成功,其他原因导致的连接失败解决方案

一、电脑中有其他品牌visa导致的冲突&#xff08;以tekvisa为例&#xff09; 1、删除tekvisa 2、下载一个NI Package Manager&#xff0c;卸载里面所有NI的东西 &#xff08;https://www.ni.com/zh-cn/support/downloads/software-products/download.package-manager.html#32…

❀五一劳动节来啦❀

今年“五一”&#xff0c;4月29日至5月3日放假调休&#xff0c;共5天。 如果你在5月4日到5月6日请假3天&#xff0c;加上5月7日周日&#xff0c;就可以形成9天的假期。 一&#xff0c;五一劳动节的由来⭐ 国际劳动节又称“五一国际劳动节”“国际示威游行日”&#xff08;英语…

人生中最好的等待叫做来日可期,社科院与杜兰大学金融管理硕士等你惊艳岁月

有句话说&#xff1a;“去日不可追&#xff0c;来日犹可期”。过去的已经过去&#xff0c;不管好的、坏的都已成为我们的回忆。人生中最好的等待就是未来可期。别辜负现在的好时光&#xff0c;努力做想做的事。社科院与杜兰大学金融管理硕士项目等你惊艳时光。 所有出众者的背…

【计算机网络:自顶向下方法】(三) 运输层 (TCP | UDP | 复用 | 传输原理rdt)

【计算机网络&#xff1a;自顶向下方法】 3.1 概述 传输层协议是在端系统中实现的传输层将发送的应用程序进程接受到的报文转换成传输层分组 (运输层报文段)实现的方法/过程 &#xff1a; 将应用报文划分为较小的块&#xff0c;并为每块加上传输层首部以生成传输层报文段ff。I…

【C++】类和对象(中篇)—— 默认成员函数,const成员函数,运算符重载

前言 类和对象没有技巧&#xff0c;只有多加练习&#xff0c;多多尝试自己完成代码&#xff0c;例如各种运算符的重载&#xff0c;或是实现一个自己的日期类 目录 一、类的六个默认成员函数 二、构造函数 2.1 概念 2.2 特点 2.3 默认无参的构造函数 三、析构函数 3.1 概…

ORB305与CISCO路由器构建L2TP over IPSec VPN操作手册

1、网络拓扑在思科路由器与ORB305之间建立一个安全隧道&#xff0c;对客户路由器端设备子网&#xff0c;与思科路由器端服务器子网之间的数据流进行安全保护&#xff0c;组网拓扑图如图所示。 2、思科路由器端配置指导(此处以多数客户使用专线上网形式为例)Cisco&#xff08;AR…

90年三本程序员,8年5跳,年薪4万变92万……

很多时候&#xff0c;虽然跳槽可能带来降薪的结果&#xff0c;但依然有很多人认为跳槽可以涨薪。近日&#xff0c;看到一则帖子。 发帖的楼主表示&#xff0c;自己8年5跳&#xff0c;年薪4万到92万&#xff0c;现在环沪上海各一套房&#xff0c;再干5年码农&#xff0c;就可以…

2022年NOC大赛创客智慧编程赛道图形化scratch初赛题,包含答案解析

目录 一、单选题 二、多选题 三、判断题 下载打印文档做题: 一、单选题

项目干系人是什么?如何有效管理项目干系人?

项目干系人是指对项目具有利益关系或影响力的个人、团体或组织。他们可能会对项目的目标、范围、进度、成本、质量等方面产生影响&#xff0c;因此&#xff0c;有效地管理项目干系人是项目管理成功的关键之一。 一、干系人识别和分类 项目经理应该首先识别和分类所有与项目有关…

STM32模数转换器(ADC)

1.ADC的简要 我们首先说一下ADC的转换过程&#xff0c;然后说一下原理&#xff0c;当然如果嫌啰嗦可以直接跳过。 ADC是英文Analog-to-Digital Converter缩写&#xff0c;翻译过来就是模数转换器&#xff0c;是指将连续变化的模拟信号转换为离散的数字信号的器件。A/D转换的作…

DiffusionDet源码阅读(1)

本文仅仅适用于已经通读过全文的小伙伴 本文代码节选自 mmdet 中的 DiffusionDet 代码&#xff0c;目前该代码还处于 Development 阶段&#xff0c;所以我博客里写的代码和之后的稳定版本可能稍有不同&#xff0c;不过不用担心&#xff0c;我们只看最关键的部分 DDPM中扩散部…