C++入门(以c为基础)——学习笔记2
1.引用
引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空
间。在语法层面,我们认为它和它引用的变量共用同一块内存空间。
可以取多个别名,也可以给别名取别名。

b/c/d本质都是别名,对d进行一个++
对于符号&,用其定义时就是引用,其他时候就是取地址
从此,改变一个变量不需要传地址,而可以在形参处定义别名,达到类似指针的效果。

“经典的错误,标准的零分”
为什么a的值还是没有改变?
尽管传入的是别名 ,但是函数接受的参数依然是个数值,是实参的拷贝。应当在形参处建立引用,这样才能真正修改我们希望修改的变量。

这样就成功改变a的值了。
结论:形参是引用,则通过形参就能改变实参,不需要传更高级的指针。
引用中需要注意的细节:
1.1引用在定义时必须先初始化
引用在定义时必须已经初始化(不能先取绰号,再找谁合适这个绰号)
一个引用可以有多个变量,就如上文的a b c d
引用一旦引用一个实体,就不能再改变

可见,不是让y变成z的别名,而是通过y,将z的值赋值给y和x
1.2引用中的权限问题
存在的问题:权限的放大
m是只读的,当n变成m的别名后,n作为int类型的变量是可读可写的。为了避免通过n修改了m这个const类型的变量(权限放大),所以不能通过编译。
这样,是权限的平移,就能通过编译了。
对一个对象(C语言中喜欢称为变量),权限可以缩小和平移,但是不能放大。


此处我可以通过y修改x,修改后z的数值也会改变(相当于z只是没有“write”的权限,z只能访问x, 并不代表这个值真真正正地锁死了)
回忆:const int* int const* int* const
const默认与其左边结合,当左边没有任何东西则与右边结合。
换句话说,const只要在*的左边,限制的就是*p1;const在*右边,限制的就是这个指针,该指针只能指向这个空间,不能改变指向。
上文中的前两种所限制的是一样的,最后一种限制的是指针,不能进行加减法。
报错的原因是:p2是可读可写的,我们可以通过p2去改变p1所指向的空间。但是p1指向的空间是被锁死了的,是不能改变的,又扩大了权限,因此报错。
数值之间没有权限的概念,只有指针和引用之间有权限的概念。
类型转化中的权限问题:
不管是强制类型转化还是隐式类型转化,其底层都是通过建立一个临时变量来进行转化。
我们先用double定义一个变量为12.34:
其转化的本质是把d的整数部分取出,赋给整形类型的临时变量,再通过临时变量赋给i。
既然是这样的赋值方法,就不难理解下图为什么会报错了:

在82行代码执行时,d先将其整数部分赋值给临时变量,但是临时变量具有常性(像一个常数一样,不可被改变),而按照int& j的方法接受该临时变量后,j作为别名,可以通过j修改该临时变量,这是不被允许的。
但如果我给这个变量定义为“只读”类型,也就是const int& k=d;
权限没有被放大,就合规了。
所有的表达式运算也会产生临时变量
int x=1;
int y=2;
x+y;
没有用变量接受x+y,但是x+y还是会进行计算,计算出的结果会放进临时变量。
同理,有变量接受x+y时也一样,x+y的值放入临时变量,所以r2前面必须加const(只读)才能保证不越界。

1.3传参和传引用效率比较

直接传值会拷贝整个变量(形参是实参的copy),传参效率弱于引用传参。
再利用一个测试函数:

(将传值执行10000次,再将传引用执行10000次,0表示其所消耗的时间是小于1ms的)
1.4从底层看引用

我们在语法层面认为:别名不开空间,存地址的变量(指针)是需要开辟空间的。
但是在汇编层面:

通过底层可知,定义指针p和引用b的汇编代码是一样的。
不过在日常的语法层面,我们依然认为引用不开空间,指针变量要开空间。
1.5指针和引用的区别
1. 引用概念上定义一个变量的别名,指针存储一个变量地址。2. 引用 在定义时 必须初始化 ,指针没有要求3. 引用 在初始化时引用一个实体后,就 不能再引用其他实体 ,而指针可以在任何时候指向任 何一个同类型实体4. 没有 NULL 引用 ,但有 NULL 指针5. 在 sizeof 中含义不同 : 引用 结果为 引用类型的大小 ,但 指针 始终是 地址空间所占字节个数 (32 位平台下占4 个字节 )6. 引用自加即引用的实体增加 1 ,指针自加即指针向后偏移一个类型的大小7. 有多级指针,但是没有多级引用8. 访问实体方式不同, 指针需要显式解引用,引用编译器自己处理9. 引用比指针使用起来相对更安全
不过对于第四点,可以单独说明一下:

不是说没有NULL引用吗?
结合底层思考为什么没有报错

通过观察汇编,我们可以发现,并没有发生解引用这一步骤。
因为其本质是和指针一样的汇编代码,所以并没有发生报错。
cpp的引用为什么不能替代指针?
如:链表:

引用不能改变指向,如果用引用的方法存下下一个节点,当你想改变链接方式时,如何处理?
所以next必须使用指针。这单纯的是语法设计的原因,因为本贾尼是按照c为基础设计的,并没有想过要完全替代C语言。在Java中,引用就是可改变的,因此java没有指针。
2.内联函数
对于一些小型的、会大量重复调用的函数,如(Swap,Add等)。不停的建立函数栈帧性价比太低,C语言使用含参数的宏来解决这个问题。
宏没有栈帧消耗,但是容易出语法问题:复杂、没有类型检查、无法调试
cpp虽然兼容c的所有用法,但是cpp更倾向于使用内联函数(inline修饰):
以 inline 修饰 的函数叫做内联函数, 编译时 C++ 编译器会在 调用内联函数的地方展开 ,没有函数调 用建立栈帧的开销,内联函数提升程序运行的效率。本质是一种空间换时间的做法。
用inline修饰函数

注意:在debug模式下,为了调试方便,依然会执行call语句,像以前的函数一样建立栈帧。

没有执行call语句,也就是没有按照函数去调用,而是直接展开。
内联函数的特点:
编译器并没有把是否展开的权利完全释放给你,而是会自己选择是否展开。
当函数中的语句过多时,就不会展开
inline对于编译器只是一种建议,编译器会自己决定是否展开(如递归等就一定不会展开)
为什么有的函数语句过多时不会展开?
大函数展开的缺点:
若我们要对一个100行的代码调用10000次:

导致编译出的可执行程序变大。可执行程序大了是一件很麻烦的事情。
最后,内联函数不能声明和定义相分离
因为内联函数是直接展开的,没有函数的地址,在链接过程中是找不到的。
其本质就是一个小型功能直接展开。
3.auto
随着程序越来越复杂,程序中用到的类型也越来越复杂,经常体现在:1. 类型难于拼写2. 含义不明确导致容易出错

根据赋值的内容,自动识别i的类型。
当然,typedef有类似的功能,但是typedef有时候会有些问题:


pstring p1 与 char* const p1是一个意思,p1 作为一个被const的变量,也具有常性,必须初始化,所以此处报错。
tips:typeid可以用来查看变量的类型名:
typeid(a).name();
auto修饰的限定

auto可以根据后面的内容进行赋值内容的条件限制。
规定:auto不能直接用来声明数组

4.基于范围的for循环
基于auto的用法,cpp抄了python的作业,使用自动循环:
for循环迭代的范围必须是确定的

for (auto e: array){e/=2;
}
auto可以改成具体的类型(int、double)等都可以,只要匹配就行
但是遍历方式是写死了的,只能从数组首到数组尾遍历。
但是传参进入的数组不能使用范围for
数组的传参本质是传入数组首元素地址,会退化。(c/cpp追求效率,在语言层进行了优化,传的是首元素地址)

而针对一个数组首元素地址,该数组循环迭代的范围是不确定的,所以不能执行。
5.nullptr和NULL
cpp的设计缺陷:
将NULL作为一个宏,代表0,而不是之前的空指针。因此,cpp中的NULL会被当作整形的int而不是空指针
所以,引入了关键字nullptr

主函数中:第一个f调用第一个函数,第二个f也调用第一个函数,第三个f调用第二个函数,第四个函数调用第二个函数。
nullptr作为关键字,是不需要包含任何头文件的
6.小结
本篇中多为零碎的c过渡到cpp的语法知识,先进行铺垫和了解,在之后会有具体而详细的使用。
相关文章:
C++入门(以c为基础)——学习笔记2
1.引用 引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空 间。在语法层面,我们认为它和它引用的变量共用同一块内存空间。 可以取多个别名,也可以给别名取别名。 b/c/d本质都是别名&#…...
设计模式-单例模式(懒汉式)
1. 概念 保证一个类只有一个实例并为该实例提供一个全局唯一的访问节点 2. 懒汉式-方式一 2.1 代码示例(方式一) 示例 public class Singleton03 {/*** 构造器私有化*/private Singleton03() {}/*** 成员变量*/private static Singleton03 INSTANCE;…...
算法| ss 回溯
39.组合总数46.全排列—478.子集79.单词搜索—1连续差相同的数字—1 39.组合总数 /*** param {number[]} candidates* param {number} target* return {number[][]}*/ // 思路 // dfs传参,传idx, 剩余target // dfs返回: 0 收集,…...
基于R语言绘制-散点小提琴图
原文链接:R语言绘图 | 散点小提琴图 本期教程 写在前面 本期的图形来自发表在Nature期刊中的文章,这样的基础图形在日常分析中使用频率较高。 获得本期教程数据及代码,后台回复关键词:20240405 绘图 设置路径 setwd("You…...
Arduino开发 esp32cam+opencv人脸识别距离+语音提醒
效果图 低于20厘米语音提醒字体变红 Arduino代码 可直接复制使用(修改自己的WIFI) #include <esp32cam.h> #include <WebServer.h> #include <WiFi.h> // 设置要连接的WiFi名称和密码 const char* WIFI_SSID "gumou"; const char* …...
LeNet卷积神经网络
文章目录 简介conv2d网络层的结构 简介 它是最早发布的卷积神经网络之一 conv2d 这个卷积成的参数先进行介绍一下: self.conv1 nn.Conv2d(in_channels3, out_channels10, kernel_size3, stride1, padding1)先看一下in_channels 输入的通道数,out_cha…...
Python常用算法思想--回溯算法思想详解【附源码】
通过回溯算法解决“组合”问题、“排序”问题、“搜索”之八皇后问题、“子集和”之0-1背包问题、字符串匹配等六个经典案例进行介绍: 一、解决“组合”问题 从给定的一组元素中找到所有可能的组合,这段代码中的 backtrack_combinations 函数使用了回溯思想,调用 backtrack…...
Day5-Hive的结构和优化、数据文件存储格式
Hive 窗口函数 案例 需求:连续三天登陆的用户数据 步骤: -- 建表 create table logins (username string,log_date string ) row format delimited fields terminated by ; -- 加载数据 load data local inpath /opt/hive_data/login into table log…...
01 计算机网络发展与分类
计算机网络:计算机技术与通信技术的结合。 阶段一:早期网络:ARPAnet。 阶段二:厂商独立发展阶段 阶段三:标准化阶段:ISO,TCP/IP 计算机网络分类 计算机网络分类1:通信子网和资源子网 通信子…...
ubuntu安装sublime3并设置中文
安装Sublime Text 3 在Ubuntu上安装Sublime Text 3可以通过以下步骤进行: 打开终端。 导入Sublime Text 3的GPG密钥: wget -qO- https://download.sublimetext.com/sublimehq-pub.gpg | sudo apt-key add - 添加Sublime Text 3的存储库: …...
python调用阿里云短信配置
1. 新增资质和签名 # 访问地址: https://dysms.console.aliyun.com/domestic/text/qualification2. 静静等待几十分钟~~~ 3. 通过sdk去调用,查看有没有python的sdk https://next.api.aliyun.com/api/Dysmsapi/2017-05-25/SendSms?完整代码 # -*- cod…...
MySQL 8.0.13安装配置教程
写个博客记录一下,省得下次换设备换系统还要到处翻教程,直接匹配自己常用的8.0.13版本 1.MySQL包解压到某个路径 2.将bin的路径加到系统环境变量Path下 3.在安装根目录下新建my.ini配置文件,并用编辑器写入如下数据 [mysqld] [client] port…...
【idea快捷键】idea开发java过程中常用的快捷键
含义win快捷键mac快捷键复制当前行或选定的代码块Ctrl DCommand D通过类名快速查找类Ctrl NCommand N通过文件名快速查找文件Ctrl Shift NCommand Shift N通过符号名称快速查找符号(类、方法等)Ctrl Alt Shift NCommand Shift O跳转到声明C…...
2024年腾讯云GPU云服务器配置价格表(内存/系统盘/地域)
腾讯云GPU服务器是提供GPU算力的弹性计算服务,腾讯云GPU服务器具有超强的并行计算能力,可用于深度学习训练、科学计算、图形图像处理、视频编解码等场景,腾讯云百科txybk.com整理腾讯云GPU服务器租用价格表、GPU实例优势、GPU解决方案、GPU软…...
重构数据访问层-优化数据访问的开发
重新整理了一下过去开发的框架,在准备开发新项目时候,重新整理了一下思路,感觉数据访问层还是很鸡肋。过去几年中,急于完成项目开发和交付,框架都是迭代过来的,虽然满足了开发需求,但是…...
云计算概述报告
以下是一篇论述类文章 文章目录 I. 云计算介绍(1)云计算基本概念(2)云计算基本特征 II. 云计算发展历程(1)云计算的起源(2)云计算的发展阶段 III. 云计算特点(1ÿ…...
C++:线程库的使用
文章目录 Windows和Linux平台的线程线程构造函数模板参数包 最近发现C11的线程库还没有进行总结,因此本篇对于C11当中新增的线程库的一些基本用法进行总结 Windows和Linux平台的线程 在Linux平台下是存在一些原生的线程系统调用的,比如有pthread_creat…...
机器学习模型:决策树笔记
第一章:决策树原理 1-决策树算法概述_哔哩哔哩_bilibili 根节点的选择应该用哪个特征?接下来选什么?如何切分? 决策树判断顺序比较重要。可以使用信息增益、信息增益率、 在划分数据集前后信息发生的变化称为信息增益,…...
20.2k stars项目搭建私人网盘界面美功能全
Nextcloud是一套用于创建网络硬盘的客户端-服务器软件。其功能与Dropbox相近,但Nextcloud是自由及开放源代码软件,每个人都可以在私人服务器上安装并执行它。 GitHub数据 20.2k stars561 watching3.2k forks 开源地址:https://github.com/ne…...
卷积篇 | YOLOv8改进之引入全维度动态卷积ODConv | 即插即用
前言:Hello大家好,我是小哥谈。ODConv是一种关注了空域、输入通道、输出通道等维度上的动态性的卷积方法,一定程度上讲,ODConv可以视作CondConv的延续,将CondConv中一个维度上的动态特性进行了扩展,同时了考虑了空域、输入通道、输出通道等维度上的动态性,故称之为全维度…...
XML Group端口详解
在XML数据映射过程中,经常需要对数据进行分组聚合操作。例如,当处理包含多个物料明细的XML文件时,可能需要将相同物料号的明细归为一组,或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码,增加了开…...
PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建
制造业采购供应链管理是企业运营的核心环节,供应链协同管理在供应链上下游企业之间建立紧密的合作关系,通过信息共享、资源整合、业务协同等方式,实现供应链的全面管理和优化,提高供应链的效率和透明度,降低供应链的成…...
【网络安全产品大调研系列】2. 体验漏洞扫描
前言 2023 年漏洞扫描服务市场规模预计为 3.06(十亿美元)。漏洞扫描服务市场行业预计将从 2024 年的 3.48(十亿美元)增长到 2032 年的 9.54(十亿美元)。预测期内漏洞扫描服务市场 CAGR(增长率&…...
渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止
<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet: https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...
微信小程序 - 手机震动
一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注:文档 https://developers.weixin.qq…...
Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级
在互联网的快速发展中,高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司,近期做出了一个重大技术决策:弃用长期使用的 Nginx,转而采用其内部开发…...
【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)
🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...
拉力测试cuda pytorch 把 4070显卡拉满
import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试,通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小,增大可提高计算复杂度duration: 测试持续时间(秒&…...
AI,如何重构理解、匹配与决策?
AI 时代,我们如何理解消费? 作者|王彬 封面|Unplash 人们通过信息理解世界。 曾几何时,PC 与移动互联网重塑了人们的购物路径:信息变得唾手可得,商品决策变得高度依赖内容。 但 AI 时代的来…...
uniapp 开发ios, xcode 提交app store connect 和 testflight内测
uniapp 中配置 配置manifest 文档:manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号:4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...

