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

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 引用的概念和定义 在语法上引用是给一个变量取别名&#xff0c;和这个变量共用同一块空间&#xff0c;并不会给引用开一块空间。 取别名就是一块空间有多个名字 类型& …...

显示产业如何突破芯片短板

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

STM32HAL库+ESP8266+cJSON+微信小程序_连接华为云物联网平台

STM32HAL库ESP8266cJSON微信小程序_连接华为云物联网平台 实验使用资源&#xff1a;正点原子F407 USART1&#xff1a;PA9P、A10&#xff08;串口打印调试&#xff09; USART3&#xff1a;PB10、PB11&#xff08;WiFi模块&#xff09; DHT11&#xff1a;PG9&#xff08;采集数据…...

debian或Ubuntu中开启ssh允许root远程ssh登录的方法

debian或Ubuntu中开启ssh允许root远程ssh登录的方法 前因&#xff1a; 因开发需要&#xff0c;需要设置开发板的ssh远程连接。 操作步骤如下&#xff1a; 安装openssh-server sudo apt install openssh-server设置root用户密码&#xff1a; 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中如何处理死锁&#xff1f; 2. MySQL中的主从复制是如何实现的&#xff1f; 3. MySQL中的慢查询日志是什么&#xff1f;如何使用它来优化性能&#xff1f; 4.存储过程 一、定义与基本概念 二、特点与优势 三、类型与分类 四、创建与执行 五、示例 六、总…...

tensorflow之欠拟合与过拟合,正则化缓解

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

vue实现a-model弹窗拖拽移动

通过自定义拖拽指令实现 实现效果 拖动顶部&#xff0c;可对整个弹窗实施拖拽&#xff08;如果需要拖动底部、中间内容实现拖拽&#xff0c;把下面的ant-modal-header对应改掉就行&#xff09; 代码实现 编写自定义指令 新建一个ts / js文件&#xff0c;用ts举例 import V…...

速盾:如何加强网站的安全性

随着互联网的快速发展&#xff0c;网站的安全性变得越来越重要。CDN&#xff08;内容分发网络&#xff09;是一种常见的网络加速服务&#xff0c;它可以将网站的静态内容分发到全球各地的服务器上&#xff0c;以提供更快的访问速度。然而&#xff0c;CDN 也存在一些安全风险&am…...

【PyTorch单点知识】自动求导机制的原理与实践

文章目录 0. 前言1. 自动求导的基本原理2. PyTorch中的自动求导2.1 创建计算图2.2 反向传播2.3 反向传播详解2.4 梯度清零2.5 定制自动求导 3. 代码实例&#xff1a;线性回归的自动求导4. 结论 0. 前言 按照国际惯例&#xff0c;首先声明&#xff1a;本文只是我自己学习的理解&…...

【Java】搜索引擎设计:信息搜索怎么避免大海捞针?

一、内容分析 我们准备开发一个针对全网内容的搜索引擎&#xff0c;产品名称为“Bingoo”。 Bingoo的主要技术挑战包括&#xff1a; 针对爬虫获取的海量数据&#xff0c;如何高效地进行数据管理&#xff1b;当用户输入搜索词的时候&#xff0c;如何快速查找包含搜索词的网页…...

【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…...

痉挛性斜颈对生活有哪些影响?

痉挛性斜颈&#xff0c;这个名字听起来可能并不熟悉&#xff0c;但它实际上是一种神经系统疾病&#xff0c;影响着全球数百万人的生活质量。它以一种无法控制的方式&#xff0c;使患者的颈部肌肉发生不自主的收缩&#xff0c;导致头部姿势异常。对于患者来说&#xff0c;痉挛性…...

Javassist 修改 jar 包里的 class 文件

前言 Javassist 是一个用于处理 Java 字节码的类库&#xff0c;可以用以修改 class 文件或 jar 包里的 class 文件。 简单来说我们用Java编写的代码是放在 java 格式的代码文件里&#xff0c;在编译的时候会编译为 class 格式的字节码文件&#xff0c;然后一般所有 class 文件…...

交换机的二三层原理

相同VLAN的交换机交换原理&#xff08;二层交换原理&#xff09;&#xff1a; 交换机收到数据帧&#xff0c;首先会检查数据帧的VLAN标签和目标MAC&#xff0c;若属于相同VLAN&#xff0c;且该目标MAC在本地MAC表中&#xff0c;则直接根据出接口进行数据转发 不同VLAN的交换机…...

HarmonyOS ArkUi 字符串<展开/收起>功能

效果图&#xff1a; 官方API&#xff1a; ohos.measure (文本计算) 方式一 measure.measureTextSize 跟方式二使用一样&#xff0c;只是API调用不同&#xff0c;可仔细查看官网方式二 API 12 import { display, promptAction } from kit.ArkUI import { MeasureUtils } fr…...

Lianwei 安全周报|2024.07.09

新的一周又开始了&#xff0c;以下是本周「Lianwei周报」&#xff0c;我们总结推荐了本周的政策/标准/指南最新动态、热点资讯和安全事件&#xff0c;保证大家不错过本周的每一个重点&#xff01; 政策/标准/指南最新动态 01 《数字中国发展报告&#xff08;2023年&#xff09…...

火遍全网的15个Python的实战项目,你该不会还不知道怎么用吧!

经常听到有朋友说&#xff0c;学习编程是一件非常枯燥无味的事情。其实&#xff0c;大家有没有认真想过&#xff0c;可能是我们的学习方法不对&#xff1f; 比方说&#xff0c;你有没有想过&#xff0c;可以通过打游戏来学编程&#xff1f; 今天我想跟大家分享几个Python小游…...

快速使用BRTR公式出具的大模型Prompt提示语

Role:文章模仿大师 Background: 你是一位文章模仿大师&#xff0c;擅长分析文章风格并进行模仿创作。老板常让你学习他人文章后进行模仿创作。 Attention: 请专注在文章模仿任务上&#xff0c;提供高质量的输出。 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&#xff1f;由于时间太久&#xff0c;我真忘记了。搜搜发现&#xff0c;还真有人和我一样。见下面的链接&#xff1a;https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...

JavaScript 中的 ES|QL:利用 Apache Arrow 工具

作者&#xff1a;来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗&#xff1f;了解下一期 Elasticsearch Engineer 培训的时间吧&#xff01; Elasticsearch 拥有众多新功能&#xff0c;助你为自己…...

css3笔记 (1) 自用

outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size&#xff1a;0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格&#xff…...

Python 训练营打卡 Day 47

注意力热力图可视化 在day 46代码的基础上&#xff0c;对比不同卷积层热力图可视化的结果 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 富媒体消息全攻略&#xff08;地理位置/文件&#xff09; 一、功能实现原理 腾讯云 IM 通过 消息扩展机制 支持富媒体类型&#xff0c;核心实现方式&#xff1a; 标准消息类型&#xff1a;直接使用 SDK 内置类型&#xff08;文件、图片等&#xff09;自…...

高考志愿填报管理系统---开发介绍

高考志愿填报管理系统是一款专为教育机构、学校和教师设计的学生信息管理和志愿填报辅助平台。系统基于Django框架开发&#xff0c;采用现代化的Web技术&#xff0c;为教育工作者提供高效、安全、便捷的学生管理解决方案。 ## &#x1f4cb; 系统概述 ### &#x1f3af; 系统定…...

Python常用模块:time、os、shutil与flask初探

一、Flask初探 & PyCharm终端配置 目的: 快速搭建小型Web服务器以提供数据。 工具: 第三方Web框架 Flask (需 pip install flask 安装)。 安装 Flask: 建议: 使用 PyCharm 内置的 Terminal (模拟命令行) 进行安装,避免频繁切换。 PyCharm Terminal 配置建议: 打开 Py…...

前端调试HTTP状态码

1xx&#xff08;信息类状态码&#xff09; 这类状态码表示临时响应&#xff0c;需要客户端继续处理请求。 100 Continue 服务器已收到请求的初始部分&#xff0c;客户端应继续发送剩余部分。 2xx&#xff08;成功类状态码&#xff09; 表示请求已成功被服务器接收、理解并处…...

归并排序:分治思想的高效排序

目录 基本原理 流程图解 实现方法 递归实现 非递归实现 演示过程 时间复杂度 基本原理 归并排序(Merge Sort)是一种基于分治思想的排序算法&#xff0c;由约翰冯诺伊曼在1945年提出。其核心思想包括&#xff1a; 分割(Divide)&#xff1a;将待排序数组递归地分成两个子…...

字符串哈希+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), …...