C++的入门基础(二)
目录
- 引用的概念和定义
- 引用的特性
- 引用的使用
- const引用
- 指针和引用的关系
- 引用的实际作用
- inline
- nullptr
引用的概念和定义
在语法上引用是给一个变量取别名,和这个变量共用同一块空间,并不会给引用开一块空间。
取别名就是一块空间有多个名字
类型& 引用别名 = 引用对象
int main()
{int a = 2;int& b = a;int& c = a;int& d = b;//对d取别名,d是b的别名,b是a的别名,d就是a的别名b++;cout << a << " " << endl;cout << b << " " << endl;cout << c << " " << endl;cout << d << " " << endl;// 都是3//这就说明了b、c、d都是a的别名,和a共用同一块空间return 0;
}
引用的特性
1.引用在定义时必须初始化(必须说明是谁的引用)
不说明是谁的引用会报错
2.一个变量可以有多个引用(给别名取别名)
3.引用一旦引用一个实体,再不能引用其他实体
(引用不能改变指向)
1,2点比较简单,现在对第三点说明一下
链表要改变指向要用二级指针
int main()
{int a = 2;int& b = a;int d = 20;b = d;//这里是赋值不是引用,b不是d的引用d++;//对d++,a和b并不改变,也说明了b不是d的引用//b本来是a的引用,并不能改变成b是d的引用,说明引用不能改变指向//后面也会介绍return 0;
}
引用的使用
1.引用做传参和做返回值
- 提高效率
- 减少拷贝
- 引用对象改变同时被引用对象改变
比如传值调用,传一个值x,函数中a拿到的是x的一份临时拷贝,而如果用引用就减少了拷贝,提高了效率,因为a是x的别名,就是给本身取了另一个名字
引用对象改变同时被引用对象改变
x++,a也++,你的别名改变了,你本身也会改变
void f1(int& x)
{x++;
}int main()
{int a = 0;f1(a);return 0;
}
引用做返回值
1.int 做返回时返回一个数值,不是直接返回而是会生成一份临时变量再返回,临时变量具有常性,不能被改变
2.int& 做返回时生成一个它的引用,再返回它的引用,数组在堆上出函数不销毁,返回数组中的引用,出函数,改变数组中的某个值
const引用
注意:权限放大和缩小只存在指针和引用里面
权限不能放大,可以缩小
1.权限放大
const int a = 10;//只读不能写(修改)
int& ra = a;//可以读可以写,权限放大
//正确写法
const int& ra = a;const int a = 10;//可读不可写
int& ra = a;
//权限放大
const int& ra = a;const int a = 10;
int rd = a;
//a只读,a的值拷贝进rd中,a一个空间,rd又是一个空间
//rd可读可写,这只是一个拷贝,不是权限放大,
//权限放大只存在指针和引用中
2.权限缩小
int b = 20;
const int& rb = b;b++;//21,本身权限不缩小
rb++;//不能够改变,只是它的引用权限缩小了
3. 产生临时对象
临时对象具有常性
- 表达式运算
int a = 10;
const int& rc = 30;
const int& rd = (a+30);
- 函数传值返回
int fun(int& a)
{a++;return a;
}
- 类型的隐式转换
double d = 2.32;
int i = d;
const int& ri = d;
//double类型转化为int时,会把整型部分放入临时变量中
指针和引用的关系
指针和引用互相不可替代
- 引用取别名不开空间,指针存一个变量的地址要开空间
- 引用必须初始化,指针建议初始化,但是语法上不是必须的,指针可以先定义,后面把一个变量的地址放入指针中
- 引用只能引用一个对象,而不能再引用其他对象,而指针可以不断改变指向
- 引用可以直接访问指向对象,指针必须解引用才能访问指向对象
- 引用和指针的sizeof含义不同,引用sizeof是引用类型的大小,指针32位平台下是4个byte,64位平台下是8个byte
- 引用不容易出现空引用和野引用,指针容易出现空指针和野指针
野引用
int& func()
{int a = 0;return a;//会产生一个别名,返回它的一个别名//出函数别名销毁,它的引用销毁//再去找它的引用,就是野引用
}
空引用
int* ptr = NULL:
int& rb = *ptr;
//空引用可以通过编译
rb++;
return 0;
//rb++是对空引用的使用
//对空引用的使用,不会返回0,会返回一个负数,异常返回
表面上是对ptr这个空指针解引用,实际上它的汇编代码并不解引用,而是把ptr的地址放入一个寄存器中,再把寄存器中的地址给rb这个别名,引用的底层是指针
引用的实际作用
以前交换两个值用传地址的方式 swap(&a,&b);
现在有了引用,可以用swap(a,b);
在主函数中调用函数不用取地址,传参过去的函数定义用引用接收void swap(int& x,int& y),可以不用指针接收,而且不用解引用那么麻烦
但是链表中的二级指针LTNode*& != LTNode&&,指针不能用引用替代掉,C++的引用不能替代指针,因为引用不能改变指针的指向,链表要改变指针的指向用二级指针,LTNode*& == LTNode** ,引用的底层可以理解为指针
引用的实际作用体现在传参里面
使用函数模板,T可以是任意类型
template<class T>
void func(const T& val)
{//...const 对象常量->具有常性临时变量->具有常性普通变量->可以权限缩小
}
inline
用inline修饰的函数叫内联函数,C++在调用的地方直接展开内联函数,就不需要建立栈桢了,这样可以提高效率
- C++的inline为了替代C语言的宏函数而设计出来的,宏函数也不建立栈桢,#define 定义的宏函数是一个宏,直接展开
- 你的代码过大,不会帮你展开,比如递归层次太深,会造成可执行程序变大,内存占用变大,编译器会帮你展开代码短小重复的代码,比如swap交换两个数的值的代码
- inline不建议声明和定义分离到两个文件,分离会导致链接错误,因为inline展开,函数定义文件的地址会消失,导致找不到函数定义,只有声明,所以定义和声明应该在同一个文件,在调用的地方展开会直接执行
- vs下默认不展开内联函数,找到项目属性做以下设置
//内联函数
inline int Add(int x,int y)
{int ret = x + y;return ret;
}
未展开内联函数
call跳转地址,建立栈桢
展开内联函数
不跳转,直接在调用的地方展开函数逻辑
nullptr
nullptr是关键字
nullptr是C++中的空指针,专门用来表示空指针,nullptr只能隐式类型的转换成其他类型的指针形式,不能转化成其他类型,比如int
C语言中的 ((void*)0)可以隐式类型转为int和int或其他类型,C++用这套在传参中也是不确定的,会传整型又会传指针
C++的NULL是0,传参中,一个函数的参数是int,另一个函数的参数是int,那么会执行第一个函数,C++中的NULL指针类型又是整型0,这样比较模糊,所以空指针用nullptr表示,nullptr也是0,但它只有指针形式
void func(int* a)
{}//1
void func(int a)
{}//2
int main()
{func(0);//2func(NULL);//2func((void*)0);//会隐式类型转化,int或int*,不确定走哪个//这样说C++走不了空指针了,所以定义一个nullptr表式空指针return 0;
}
#define NULL 0 C++
#define NULL ((void*)0) C
相关文章:

C++的入门基础(二)
目录 引用的概念和定义引用的特性引用的使用const引用指针和引用的关系引用的实际作用inlinenullptr 引用的概念和定义 在语法上引用是给一个变量取别名,和这个变量共用同一块空间,并不会给引用开一块空间。 取别名就是一块空间有多个名字 类型& …...

显示产业如何突破芯片短板
尽管中国在显示IC领域面临一定的不足,但新技术的不断涌现为中国企业提供了重要的发展机遇。随着手机、平板电脑和液晶电视对显示屏性能要求的不断提高,显示驱动IC也必须相应地发展,向更高分辨率、更大尺寸和更低功耗的方向迈进。例如…...

STM32HAL库+ESP8266+cJSON+微信小程序_连接华为云物联网平台
STM32HAL库ESP8266cJSON微信小程序_连接华为云物联网平台 实验使用资源:正点原子F407 USART1:PA9P、A10(串口打印调试) USART3:PB10、PB11(WiFi模块) DHT11:PG9(采集数据…...
debian或Ubuntu中开启ssh允许root远程ssh登录的方法
debian或Ubuntu中开启ssh允许root远程ssh登录的方法 前因: 因开发需要,需要设置开发板的ssh远程连接。 操作步骤如下: 安装openssh-server sudo apt install openssh-server设置root用户密码: sudo passwd root允许root用户…...
C++《日期》实现
C《日期》实现 头文件实现文件 头文件 在该文件中是为了声明函数和定义类成员 using namespace std; class Date {friend ostream& operator<<(ostream& out, const Date& d);//友元friend istream& operator>>(istream& cin, Date& d);//…...
【面试题】MySQL(第三篇)
目录 1. MySQL中如何处理死锁? 2. MySQL中的主从复制是如何实现的? 3. MySQL中的慢查询日志是什么?如何使用它来优化性能? 4.存储过程 一、定义与基本概念 二、特点与优势 三、类型与分类 四、创建与执行 五、示例 六、总…...

tensorflow之欠拟合与过拟合,正则化缓解
过拟合泛化性弱 欠拟合解决方法: 增加输入特征项 增加网络参数 减少正则化参数 过拟合的解决方法: 数据清洗 增大训练集 采用正则化 增大正则化参数 正则化缓解过拟合 正则化在损失函数中引入模型复杂度指标,利用给w增加权重,…...

vue实现a-model弹窗拖拽移动
通过自定义拖拽指令实现 实现效果 拖动顶部,可对整个弹窗实施拖拽(如果需要拖动底部、中间内容实现拖拽,把下面的ant-modal-header对应改掉就行) 代码实现 编写自定义指令 新建一个ts / js文件,用ts举例 import V…...
速盾:如何加强网站的安全性
随着互联网的快速发展,网站的安全性变得越来越重要。CDN(内容分发网络)是一种常见的网络加速服务,它可以将网站的静态内容分发到全球各地的服务器上,以提供更快的访问速度。然而,CDN 也存在一些安全风险&am…...
【PyTorch单点知识】自动求导机制的原理与实践
文章目录 0. 前言1. 自动求导的基本原理2. PyTorch中的自动求导2.1 创建计算图2.2 反向传播2.3 反向传播详解2.4 梯度清零2.5 定制自动求导 3. 代码实例:线性回归的自动求导4. 结论 0. 前言 按照国际惯例,首先声明:本文只是我自己学习的理解&…...

【Java】搜索引擎设计:信息搜索怎么避免大海捞针?
一、内容分析 我们准备开发一个针对全网内容的搜索引擎,产品名称为“Bingoo”。 Bingoo的主要技术挑战包括: 针对爬虫获取的海量数据,如何高效地进行数据管理;当用户输入搜索词的时候,如何快速查找包含搜索词的网页…...
【Python】ModuleNotFoundError: No module named ‘distutils.util‘ bug fix
【Python】ModuleNotFoundError: No module named distutils.util bug fix 1. error like this2. how to fix why this error occured , because i remove the origin version python of ubuntu of 20.04. then the system trapped in tty1 , you must make sure the laptop li…...
痉挛性斜颈对生活有哪些影响?
痉挛性斜颈,这个名字听起来可能并不熟悉,但它实际上是一种神经系统疾病,影响着全球数百万人的生活质量。它以一种无法控制的方式,使患者的颈部肌肉发生不自主的收缩,导致头部姿势异常。对于患者来说,痉挛性…...
Javassist 修改 jar 包里的 class 文件
前言 Javassist 是一个用于处理 Java 字节码的类库,可以用以修改 class 文件或 jar 包里的 class 文件。 简单来说我们用Java编写的代码是放在 java 格式的代码文件里,在编译的时候会编译为 class 格式的字节码文件,然后一般所有 class 文件…...
交换机的二三层原理
相同VLAN的交换机交换原理(二层交换原理): 交换机收到数据帧,首先会检查数据帧的VLAN标签和目标MAC,若属于相同VLAN,且该目标MAC在本地MAC表中,则直接根据出接口进行数据转发 不同VLAN的交换机…...

HarmonyOS ArkUi 字符串<展开/收起>功能
效果图: 官方API: ohos.measure (文本计算) 方式一 measure.measureTextSize 跟方式二使用一样,只是API调用不同,可仔细查看官网方式二 API 12 import { display, promptAction } from kit.ArkUI import { MeasureUtils } fr…...
Lianwei 安全周报|2024.07.09
新的一周又开始了,以下是本周「Lianwei周报」,我们总结推荐了本周的政策/标准/指南最新动态、热点资讯和安全事件,保证大家不错过本周的每一个重点! 政策/标准/指南最新动态 01 《数字中国发展报告(2023年)…...

火遍全网的15个Python的实战项目,你该不会还不知道怎么用吧!
经常听到有朋友说,学习编程是一件非常枯燥无味的事情。其实,大家有没有认真想过,可能是我们的学习方法不对? 比方说,你有没有想过,可以通过打游戏来学编程? 今天我想跟大家分享几个Python小游…...

快速使用BRTR公式出具的大模型Prompt提示语
Role:文章模仿大师 Background: 你是一位文章模仿大师,擅长分析文章风格并进行模仿创作。老板常让你学习他人文章后进行模仿创作。 Attention: 请专注在文章模仿任务上,提供高质量的输出。 Profile: Author: 一博Version: 1.0Language: 中文Descri…...

Xilinx FPGA DDR4 接口的 PCB 准则
目录 1. 简介 1.1 FPGA-MIG 与 DDR4 介绍 1.2 DDR4 信号介绍 1.2.1 Clock Signals 1.2.2 Address and Command Signals 1.2.3 Control Signals 1.2.4 Data Signals 1.2.5 Other Signals 2. 通用存储器布线准则 3. Xilinx FPGA-MIG 的 PCB 准则 3.1 引脚配置 3.1.1 …...

stm32G473的flash模式是单bank还是双bank?
今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...

JavaScript 中的 ES|QL:利用 Apache Arrow 工具
作者:来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗?了解下一期 Elasticsearch Engineer 培训的时间吧! Elasticsearch 拥有众多新功能,助你为自己…...
css3笔记 (1) 自用
outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size:0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格ÿ…...
Python 训练营打卡 Day 47
注意力热力图可视化 在day 46代码的基础上,对比不同卷积层热力图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pypl…...
uniapp 集成腾讯云 IM 富媒体消息(地理位置/文件)
UniApp 集成腾讯云 IM 富媒体消息全攻略(地理位置/文件) 一、功能实现原理 腾讯云 IM 通过 消息扩展机制 支持富媒体类型,核心实现方式: 标准消息类型:直接使用 SDK 内置类型(文件、图片等)自…...

高考志愿填报管理系统---开发介绍
高考志愿填报管理系统是一款专为教育机构、学校和教师设计的学生信息管理和志愿填报辅助平台。系统基于Django框架开发,采用现代化的Web技术,为教育工作者提供高效、安全、便捷的学生管理解决方案。 ## 📋 系统概述 ### 🎯 系统定…...
Python常用模块:time、os、shutil与flask初探
一、Flask初探 & PyCharm终端配置 目的: 快速搭建小型Web服务器以提供数据。 工具: 第三方Web框架 Flask (需 pip install flask 安装)。 安装 Flask: 建议: 使用 PyCharm 内置的 Terminal (模拟命令行) 进行安装,避免频繁切换。 PyCharm Terminal 配置建议: 打开 Py…...
前端调试HTTP状态码
1xx(信息类状态码) 这类状态码表示临时响应,需要客户端继续处理请求。 100 Continue 服务器已收到请求的初始部分,客户端应继续发送剩余部分。 2xx(成功类状态码) 表示请求已成功被服务器接收、理解并处…...

归并排序:分治思想的高效排序
目录 基本原理 流程图解 实现方法 递归实现 非递归实现 演示过程 时间复杂度 基本原理 归并排序(Merge Sort)是一种基于分治思想的排序算法,由约翰冯诺伊曼在1945年提出。其核心思想包括: 分割(Divide):将待排序数组递归地分成两个子…...
字符串哈希+KMP
P10468 兔子与兔子 #include<bits/stdc.h> using namespace std; typedef unsigned long long ull; const int N 1000010; ull a[N], pw[N]; int n; ull gethash(int l, int r){return a[r] - a[l - 1] * pw[r - l 1]; } signed main(){ios::sync_with_stdio(false), …...