当前位置: 首页 > news >正文

【C++初阶】C++入门(下)

【C++初阶】C++入门(下)

🥕个人主页:开敲🍉

🥕所属专栏:C++🥭

🌼文章目录🌼

6. 引用

    6.1 引用的概念

    6.2 引用特性

    6.3 常引用

    6.4 使用场景

    6.5 传值、传引用效率比较

    6.6 引用和指针的区别

7. 内联函数

    7.1 内联函数的概念

    7.2 特性

8. 指针空值nullptr

6. 引用
    6.1 引用的概念

  引用不是定义一个新的变量,而是给一个已有的变量取别名,因此引用并不会开辟额外的空间,它跟它引用的变量共用一块空间。举个简单的例子:有个人名字叫张小明,在家里他爸妈给他取了一个小名叫明明,在学校同学们给他取了个名字叫小明,这里的明明和小明都可以理解为张小明的引用,它们所指向的对象都是张小明。

  引用:类型 & 引用变量名 = 引用实体:

因为pa就是a,所以改变pa的值自然也就会改变a的值,因为操作pa就是在操作a:

  注意:引用类型必须和引用对象是相同类型的!

    6.2 引用特性

引动在定义时必须初始化,换句话说,引用必须指向一个对象,不能空引用

一个变量可以有多个引用,这点也很好理解,就像上面的张小明,在家里他爸妈叫他明明,在学校同学叫他小明:

 引用一旦指向了某个对象,则不能再更改引用的对象

    6.3 常引用

权限放大:

  由此可以知道权限放大是错误的,不合法的。

权限缩小:

  由此可以知道权限缩小是合法的。

    6.4 使用场景

做参数

  在过去我们学习C语言时,想要将两个变量的值进行交换,我们写出的交换函数是这样的:

会不会觉得这样挺麻烦的,又要进行取地址操作&,又要进行解引用操作。

现在,我们学习了引用之后,我们就可以这样写:

能够这样写的原理就是上面说的,引用是对一个变量取别名,对这个别名的操作就是对变量本身的操作。

② 做返回值

    6.5 传值、传引用效率比较

  以值作为参数或者返回值类型,在传参和返回期间,函数不会直接传递实参或者将变量本身直
接返回,而是传递实参或者返回变量的一份临时的拷贝,因此用值作为参数或者返回值类型,效
率是非常低下的,尤其是当参数或者返回值类型非常大时,效率就更低。

    6.6 引用和指针的区别

  引用是变量的一个别名,并不会开辟额外的空间,它和它引用的对象共用一块空间,对引用的操作就是对变量的操作,属于直接操作而指针是一块地址,它保存所指向对象的地址,因此指针开辟了额外的空间,对变量操作需要对指针解引用,因此属于间接操作引用在定义时必须初始化,而指针初不初始化都行不能出现空引用,可以出现空指针在sizeof中引用的大小就是所指向对象类型的大小,而指针始终为地址所占的空间大小(32位平台下为4个字节);

总结:

 引用概念上定义一个变量的别名,指针存储一个变量地址。

引用在定义时必须初始化,指针可以不初始化

引用在指向了一个对象后不能再更改,而指针可以随便指向任何同一类型的对象

不能出现空引用,可以出现空指针

在sizeof中的含义不同:引用为指向对象类型的大小,指针固定为地址的大小(32位平台下为4个字节)

对引用的操作就是对变量的直接操作,指针对变量操作需要解引用,属于间接操作

引用比指针使用起来相对更加安全

7. 内联函数
    7.1 内联函数的概念

  以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方将其展开(不是一定的,这取决于编译器是否将其看作内联函数),没有函数调用建立的栈帧开销,因此内联函数提升了运行的效率。

  如上图,没有使用内联函数时,反汇编中会有一句call指令,这说明编译器为这个函数开辟了一块栈帧,产生了空间的消耗。

  如上图,使用内联函数后,编译器会将内联函数展开,因此没有了栈帧的创建。

    7.2 特性

inline是一种以空间换时间的做法,如果编译器将函数当作内联函数处理,在编译阶段,编译器会将内联函数展开缺陷:可能会使代码量变大;优点:少了栈帧的创建,提高了运行效率。

inline对于编译器来说只是一种建议,编译器是否会将其看作是内联函数取决于编译器本身,不同的编译器判断不一样。一般:当函数规模较小、非递归、函数频繁调用时可以采用inline修饰,否则编译器可能不会将其看作为内联函数。下图为《C++ Prime》第五版对inline的建议:

inline不建议声明和定义分离,如果将inline的声明和定义分离会导致链接错误。因为当inline被展开后就没有了地址(没有开辟栈帧),链接时就找不到它。

8. 指针空值nullptr

  在良好的C/C++编程习惯中,声明一个变量时最好给该变量一个合适的初始值,否则可能会出现
不可预料的错误,比如未初始化的指针。如果一个指针没有合法的指向,我们基本都是按照如下
方式对其进行初始化:

  NULL实际是一个宏,在传统的C头文件(stddef.h)中,可以看到如下代码:

  可以看到,在C++中,NULL为常量0;在C语言中,NULL为void*类型的常量。但是无论是哪种形式,在使用NULL时都不可避免会遇到一些麻烦,比如:

  可以看到,func(NULL)的调用初衷是想调用第二个func,但是却调用了第一个,这就产生了歧义。

  在C++98中,字面常量0既可以是一个整形数字,也可以是无类型的指针(void*)常量,但是编译器
默认情况下将其看成是一个整形常量,如果要将其按照指针方式来使用,必须对其进行强转(void
*)0。

  因此在C++中,我们最好使用nullptr关键字来替代NULLnullptr是专门用于指针类型的指针,而NULL即能代表常量0,又能代表(void*)类型的常量,出现歧义。

  注意:

在使用nullptr表示指针空值时,不需要包含头文件,因为nullptr是C++11作为关键字引入的。

在C++11中,sizeof(nullptr)与sizeof((void*)0)所占字节大小相同。

为了提高代码的健壮性,在后续表示指针空指时最好都使用nullptr。

                                                  创作不易,点个赞呗,蟹蟹啦~

                                                         

相关文章:

【C++初阶】C++入门(下)

【C初阶】C入门(下) 🥕个人主页:开敲🍉 🥕所属专栏:C🥭 🌼文章目录🌼 6. 引用 6.1 引用的概念 6.2 引用特性 6.3 常引用 6.4 使用场景 6.5 传值、传引用效率…...

【3】迁移学习模型

【3】迁移学习模型 文章目录 前言一、安装相关模块二、训练代码2.1. 管理预训练模型2.2. 模型训练代码2.3. 可视化结果2.4. 类别函数 总结 前言 主要简述一下训练代码 三叶青图像识别研究简概 一、安装相关模块 #xingyun的笔记本 print(xingyun的笔记本) %pip install d2l %…...

【工具分享】FOFA——网络空间测绘搜索引擎

文章目录 FOFA介绍FOFA语法其他引擎 FOFA介绍 FOFA官网:https://fofa.info/ FOFA(Fingerprinting Organizations with Advanced Tools)是一款网络空间测绘的搜索引擎,它专注于帮助用户收集和分析互联网上的设备和服务信息。FOFA…...

[嵌入式 C 语言] 按位与、或、取反、异或

若协议中如下图所示: 注意: 长度为1,表示1个字节,也就是0xFF,也就是 1111 1111 (这里0xFF只是单纯表示一个数,也可以是其他数,这里需要注意的是1个字节的意思) 一、按位…...

Android --- 运行时Fragment如何获取Activity中的数据,又如何将数据传递到Activity中呢?

1.通过 getActivity() 方法获取 Activity 实例: 在 Fragment 中,可以通过 getActivity() 方法获取当前 Fragment 所依附的 Activity 实例。然后可以调用 Activity 的公共方法或者直接访问 Activity 的字段来获取数据。 // 在 Fragment 中获取 Activity…...

Java后端开发(十三)-- Java8 stream的 orElse(null) 和 orElseGet(null)

orElse(null)表示如果一个都没找到返回null。【orElse()中可以塞默认值。如果找不到就会返回orElse中你自己设置的默认值。】 orElseGet(null)表示如果一个都没找到返回null。【orElseGet()中可以塞默认值。如果找不到就会返回orElseGet中你自己设置的默认值。】 区别就…...

L2 LangGraph_Components

参考自https://www.deeplearning.ai/short-courses/ai-agents-in-langgraph,以下为代码的实现。 这里用LangGraph把L1的ReAct_Agent实现,可以看出用LangGraph流程化了很多。 LangGraph Components import os from dotenv import load_dotenv, find_do…...

09.C2W4.Word Embeddings with Neural Networks

往期文章请点这里 目录 OverviewBasic Word RepresentationsIntegersOne-hot vectors Word EmbeddingsMeaning as vectorsWord embedding vectors Word embedding processWord Embedding MethodsBasic word embedding methodsAdvanced word embedding methods Continuous Bag-…...

硅谷甄选二(登录)

一、登录路由静态组件 src\views\login\index.vue <template><div class"login_container"><!-- Layout 布局 --><el-row><el-col :span"12" :xs"0"></el-col><el-col :span"12" :xs"2…...

scipy库中,不同应用滤波函数的区别,以及FIR滤波器和IIR滤波器的区别

一、在 Python 中&#xff0c;有多种函数可以用于应用 FIR/IIR 滤波器&#xff0c;每个函数的使用场景和特点各不相同。以下是一些常用的 FIR /IIR滤波器应用函数及其区别&#xff1a; from scipy.signal import lfiltery lfilter(fir_coeff, 1.0, x)from scipy.signal impo…...

简谈设计模式之建造者模式

建造者模式是一种创建型设计模式, 旨在将复杂对象的构建过程与其表示分离, 使同样的构建过程可以构建不同的表示. 建造者模式主要用于以下情况: 需要创建的对象非常复杂: 这个对象由多个部分组成, 且这些部分需要一步步地构建不同的表示: 通过相同的构建过程可以生成不同的表示…...

力扣 hot100 -- 动态规划(下)

目录 &#x1f4bb;最长递增子序列 AC 动态规划 AC 动态规划(贪心) 二分 &#x1f3e0;乘积最大子数组 AC 动规 AC 用 0 分割 &#x1f42c;分割等和子集 AC 二维DP AC 一维DP ⚾最长有效括号 AC 栈 哨兵 &#x1f4bb;最长递增子序列 300. 最长递增子序列…...

【计算机毕业设计】018基于weixin小程序实习记录

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…...

力扣之有序链表去重

删除链表中的重复元素&#xff0c;重复元素保留一个 p1 p2 1 -> 1 -> 2 -> 3 -> 3 -> null p1.val p2.val 那么删除 p2&#xff0c;注意 p1 此时保持不变 p1 p2 1 -> 2 -> 3 -> 3 -> null p1.val ! p2.val 那么 p1&#xff0c;p2 向后移动 p1 …...

Apache配置与应用(优化apache)

Apache配置解析&#xff08;配置优化&#xff09; Apache链接保持 KeepAlive&#xff1a;决定是否打开连接保持功能&#xff0c;后面接 OFF 表示关闭&#xff0c;接 ON 表示打开 KeepAliveTimeout&#xff1a;表示一次连接多次请求之间的最大间隔时间&#xff0c;即两次请求之间…...

怎么将3张照片合并成一张?这几种拼接方法很实用!

怎么将3张照片合并成一张&#xff1f;在我们丰富多彩的日常生活里&#xff0c;是否总爱捕捉那些稍纵即逝的美好瞬间&#xff0c;将它们定格为一张张珍贵的图片&#xff1f;然而&#xff0c;随着时间的推移&#xff0c;这些满载回忆的宝藏却可能逐渐演变成一项管理挑战&#xff…...

YOLOv10改进 | 图像去雾 | MB-TaylorFormer改善YOLOv10高分辨率和图像去雾检测(ICCV,全网独家首发)

一、本文介绍 本文给大家带来的改进机制是图像去雾MB-TaylorFormer&#xff0c;其发布于2023年的国际计算机视觉会议&#xff08;ICCV&#xff09;上&#xff0c;可以算是一遍比较权威的图像去雾网络&#xff0c; MB-TaylorFormer是一种为图像去雾设计的多分支高效Transformer…...

spring boot读取yml配置注意点记录

问题1&#xff1a;yml中配置的值加载到代码后值变了。 现场yml配置如下&#xff1a; type-maps:infos:data_register: 0ns_xzdy: 010000ns_zldy: 020000ns_yl: 030000ns_jzjz: 040000ns_ggglyggfwjz: 050000ns_syffyjz: 060000ns_gyjz: 070000ns_ccywljz: 080000ns_qtjz: 090…...

电子电气架构 --- 关于DoIP的一些闲思 下

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己,无利益不试图说服别人,是精神上的节…...

Java getSuperclass和getGenericSuperclass

1.官方API对这两个方法的介绍 getSuperclass : 返回表示此 Class 所表示的实体&#xff08;类、接口、基本类型或 void&#xff09;的超类的 Class。如果此 Class 表示 Object 类、一个接口、一个基本类型或 void&#xff0c;则返回 null。如果此对象表示一个数组类&#xff…...

在软件开发中正确使用MySQL日期时间类型的深度解析

在日常软件开发场景中&#xff0c;时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志&#xff0c;到供应链系统的物流节点时间戳&#xff0c;时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库&#xff0c;其日期时间类型的…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)

文章目录 1.什么是Redis&#xff1f;2.为什么要使用redis作为mysql的缓存&#xff1f;3.什么是缓存雪崩、缓存穿透、缓存击穿&#xff1f;3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

ssc377d修改flash分区大小

1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...

C# 类和继承(抽象类)

抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...

AI,如何重构理解、匹配与决策?

AI 时代&#xff0c;我们如何理解消费&#xff1f; 作者&#xff5c;王彬 封面&#xff5c;Unplash 人们通过信息理解世界。 曾几何时&#xff0c;PC 与移动互联网重塑了人们的购物路径&#xff1a;信息变得唾手可得&#xff0c;商品决策变得高度依赖内容。 但 AI 时代的来…...

深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用

文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么&#xff1f;1.1.2 感知机的工作原理 1.2 感知机的简单应用&#xff1a;基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...

【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论

路径问题的革命性重构&#xff1a;基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中&#xff08;图1&#xff09;&#xff1a; mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...

GO协程(Goroutine)问题总结

在使用Go语言来编写代码时&#xff0c;遇到的一些问题总结一下 [参考文档]&#xff1a;https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现&#xff1a; 今天在看到这个教程的时候&#xff0c;在自己的电…...

android13 app的触摸问题定位分析流程

一、知识点 一般来说,触摸问题都是app层面出问题,我们可以在ViewRootImpl.java添加log的方式定位;如果是touchableRegion的计算问题,就会相对比较麻烦了,需要通过adb shell dumpsys input > input.log指令,且通过打印堆栈的方式,逐步定位问题,并找到修改方案。 问题…...

算法打卡第18天

从中序与后序遍历序列构造二叉树 (力扣106题) 给定两个整数数组 inorder 和 postorder &#xff0c;其中 inorder 是二叉树的中序遍历&#xff0c; postorder 是同一棵树的后序遍历&#xff0c;请你构造并返回这颗 二叉树 。 示例 1: 输入&#xff1a;inorder [9,3,15,20,7…...