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 …...
变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析
一、变量声明设计:let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性,这种设计体现了语言的核心哲学。以下是深度解析: 1.1 设计理念剖析 安全优先原则:默认不可变强制开发者明确声明意图 let x 5; …...
日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...
脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)
一、数据处理与分析实战 (一)实时滤波与参数调整 基础滤波操作 60Hz 工频滤波:勾选界面右侧 “60Hz” 复选框,可有效抑制电网干扰(适用于北美地区,欧洲用户可调整为 50Hz)。 平滑处理&…...
涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战
“🤖手搓TuyaAI语音指令 😍秒变表情包大师,让萌系Otto机器人🔥玩出智能新花样!开整!” 🤖 Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制(TuyaAI…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用
1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...
push [特殊字符] present
push 🆚 present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中,push 和 present 是两种不同的视图控制器切换方式,它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...
虚拟电厂发展三大趋势:市场化、技术主导、车网互联
市场化:从政策驱动到多元盈利 政策全面赋能 2025年4月,国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》,首次明确虚拟电厂为“独立市场主体”,提出硬性目标:2027年全国调节能力≥2000万千瓦࿰…...
在 Spring Boot 项目里,MYSQL中json类型字段使用
前言: 因为程序特殊需求导致,需要mysql数据库存储json类型数据,因此记录一下使用流程 1.java实体中新增字段 private List<User> users 2.增加mybatis-plus注解 TableField(typeHandler FastjsonTypeHandler.class) private Lis…...
boost::filesystem::path文件路径使用详解和示例
boost::filesystem::path 是 Boost 库中用于跨平台操作文件路径的类,封装了路径的拼接、分割、提取、判断等常用功能。下面是对它的使用详解,包括常用接口与完整示例。 1. 引入头文件与命名空间 #include <boost/filesystem.hpp> namespace fs b…...
GAN模式奔溃的探讨论文综述(一)
简介 简介:今天带来一篇关于GAN的,对于模式奔溃的一个探讨的一个问题,帮助大家更好的解决训练中遇到的一个难题。 论文题目:An in-depth review and analysis of mode collapse in GAN 期刊:Machine Learning 链接:...
