C++入门基本语法(2)
一、引用
1、基本概念与定义
引用不是新定义一个变量,而是给已存在的变量起一个别名,编译器不会为引用变量开辟内存空间,它和它所引用的变量公用同一块内存空间;
引用的写法:变量类型& 引用别名 =变量;
###代码示例:
#include<iostream>
using namespace std;int main()
{int a = 10;int& b = a;//b是a的别名;cout << " a的地址:" << &a << endl;cout << "别名b的地址:" << &b << endl;cout << "a的值:" << a << endl;cout << "b的值:" << b << endl;a++;cout << "a的值:" << a << endl;cout << "b的值:" << b << endl;b++;cout << "a的值:" << a << endl;cout << "b的值:" << b << endl;return 0;
}
别名b和a公用一块内存地址,改变a,b也改变;改变b,a也改变;
2、引用的特性
(1)引用在定义的时候必须初始化;
(2)一个实体可以被多次引用(即一个变量可以有多个别名);
(3)引用一旦引用一个实体就不能再去引用其他的实体。
###代码示例:
不初始化就会报错;
反例:

一个实体可以有多个别名;对别名起别名实际上就是对那个实体再起一个别名;
int main()
{int a = 10;int& b = a;int& c = a;int& d = b;cout << " a的地址:" << &a << endl;cout << "别名b的地址:" << &b << endl;cout << "别名c的地址:" << &b << endl;cout << "别名d的地址:" << &b << endl;return 0;
}

引用只能对一个实体引用;
反例:
![]()
3、引用的使用
(1)引用作为形参,当传实参地址时,让函数的形参为实参的别名,而不是指针类型的形参;这样可以简化代码量;在改变引用变量时,别实体也会发生改变;
###代码示例:
void Swap(int& x, int& y)
{int tmp = x;x = y;y = tmp;
}
int main()
{int a = 10;int b = 30;cout << "交换之前的 a:" << a << endl;cout << "交换之前的 b:" << b << endl;Swap(a, b);cout << "交换之后的 a:" << a << endl;cout << "交换之后的 b:" << b << endl;
}
可以看到:不使用指针作为形参也能让实参发生改变;
(2)引用作为函数的返回值,一般的返回值都是在内存的临时开辟再拷贝的,使用引用作为返回值可以提高效率;更重要的一点是:可以在改变引用对象的同时改变被引用的对象;
###代码示例:
int& Func(int& x)
{return x;
}
int main()
{int a = 10;int b = 200;Func(a) = b;cout << "a的值:" << a << endl;
}
当返回类型是别名时,Func(a)实际上就是a的别名,给这个别名赋值200,那么a的值也会改变;
4、const引用
(1)对一个const对象引用时,必须要用const引用的类型;对一个非const对象引用时,可以用const引用,也可以不用;这里涉及到访问权限放大和缩小的问题,通过代码来介绍;
###代码说明:

这是因为,const int a的访问权限是只读,也就是a的值不能被修改;但是写成int& x=a,x是a的别名,但是int& x前面没有const,这样写有这个意思:x是的值可以被改变 ;那就和a不能修改相悖了,因为x、a是共用一块空间;
若是这样写那么就把a的访问权限放大了,由只读变为可读可写,这样是不允许的;
要这样写才对:

当用const int&去给一个非const对象起别名时却是可以的;此时原本可读可写的访问权限变为只读;这里是访问权限的缩小,当然缩小的访问权限只是别名,不会影响到原本的对象;
###代码示例:

虽然x被const限定了,但是可以通过改变a来改变x;反过来就不行了。
可以这样理解:int a = 10; 是先写的,那么就默认了a可以改变的事实,之后写const int& x只是x不能被修改,但是a之前就默认了可以修改。
(2) 下面几种等号右边的式子都具有常性,是不能被修改的,若是给它们起非const的别名,那么就是访问权限被放大了,是不行的;
###代码示例:
反例:
##1、

30是一个常量,具有常性,这样给它起别名,那么30的访问空间由只读变为可读可写了,显然是不行的;
正确的写法:

##2、
a+b看似是一个等式,但是a+b的值会保存在一个临时对象中,实际上传给ry的时这个临时对象;临时对象的性质是具有常性;常性表示是不能被修改的
正确写法:

##3、
同样地,在涉及到隐式类型转换时,也会给等号右边地值建立一个临时对象,而临时对象具有常性;
###代码示例:
用int& 类型的去给double的变量起别名;double类型的变量会隐式转换类型,转换之后的是一个临时对象,临时对象是在内存上重新开辟的,且具有常性;

正确写法:

5、指针和引用的关系
指针和引用在C++中相辅相成,在不同的场景具有不同的优势,两者配合使用;
(1)引用不需要开辟空间,但是指针存储一个变量的地址,需要开辟空间;
(2)引用只能对一个变量起别名,但是指针可以改变指向,指向多个不同的变量;
(3)引用在使用时必须初始化,但是指针没有强制规定是否要初始化;
(4)引用在使用时直接用,指针需要解引用;
(5)指针的大小与平台有关,而引用的大小是被引用对象的大小;
(6)指针在使用时由解引用空指针和野指针的问题出现,风险相对引用较大;
二、内联函数inline
在函数名前面加上inline就是内联函数,内联函数在调用函数的地方直接展开函数,不需要像一般调用函数那样需要开辟函数栈帧。这样一来,提高了效率;
内联函数主要是和宏函数相比;宏函数也不需要开辟函数栈帧,直接展开之后替换,但是和内联函数相比,宏函数相对很容易出错,所以这也是内联函数的优势;
举几个宏函数易出错的示例:

但是使用函数就可以避免这些,因为实参的石式子会在传参时就完成,在进入函数内部时已经成了一个值;
内联函数多使用在调用很多次短小函数的场景;首先相比于宏函数,内联函数不易出错;相较于普通函数,内联函数不需要开辟函数栈帧,调用了很多次只需要展开一次就好了,汇编中会有一个call指令,展开函数时,只需要展开一次,之后再调用这个函数时,call指令会直接使用展开好的指令;在函数定义代码量很多时,展开就不是那么好了;
所以说内联函数用在多次调用短小函数的地方。
三、nullptr
NULL实际上是一个宏,在传统的C头文件(stddef.h)中有:
#ifndef NULL#ifdef __cplusplus#define NULL 0#else#define NULL ((void *)0)#endif
#endif
在C++中NULL被定义为常量 0 ;或者C中被定义为无类型指针(void*)的常量,无论哪种定义,在调用空值的指针时,都会遇到不可避免地麻烦;
所以在C++中引入了关键字nullptr,它可以转换成任意一种类型的指针。
相关文章:
C++入门基本语法(2)
一、引用 1、基本概念与定义 引用不是新定义一个变量,而是给已存在的变量起一个别名,编译器不会为引用变量开辟内存空间,它和它所引用的变量公用同一块内存空间; 引用的写法:变量类型& 引用别名 变量ÿ…...
Internet Download Manager(IDM)2024中文版本有哪些新功能?6.42版本功能介绍
1. Internet Download Manager(IDM)是一款功能强大的下载管理器,支持所有流行的浏览器,并可提升下载速度高达5倍。 2. IDM具有智能下载逻辑加速器,可以设置文件下载优先级、分块下载等,提高下载效率。 IDM…...
深入理解 C 语言中的联合体
目录 引言 一、 联合体的定义与基本用法 1.联合体的定义 2.基本用法 二、 联合体与结构体的区别 1.结构体 2.联合体 3.对比 三、联合体的优势 1. 节省内存 2. 提高效率 3. 代码简洁性 四、联合体的存储细节 1.内存对齐 2.大小计算 五、联合体的高级用法 1.匿…...
OpenCV||超详细的几何变换
2D图像几何变换的33矩阵: 图像常见的几何变换: 图像来源:《OpenCV 4.5计算机视觉开发实战:基于Python》作者:朱文伟 李建英; 1. 平移(Translation) 在OpenCV中,平移不是…...
网络程序设计基础概述
文章目录 前言一、网络程序设计基础二、网络协议 1.IP协议2.TCP与UDP协议三、端口与套接字总结 前言 网络程序设计编写的是与其他计算机进行通信的程序代码。Java将网络程序所需要的东西封装成了不同的类。开发者只需要创建这些类的对象,调用相应的方法,…...
MySQL:数据库用户
数据库用户 在关系型数据库管理系统中,数据库用户(USER)是指具有特定权限和访问权限的登录账户。每个用户都有自己的用户名和密码,以便系统可以通过认证来识别他们的身份。数据库用户可以登录数据库,在其中执行各种类…...
用TensorFlow训练自己的第一个模型
现在学AI的一个优势就是:前人栽树后人乘凉,很多资料都已完善,而且有很多很棒的开源作品可以学习,感谢大佬们 项目 项目源码地址 视频教程地址 我在大佬的基础上基于此模型还加上了根据特征值缓存进行快速识别的方法,…...
MySQL数据库入门基础知识 【1】推荐
数据库就是储存和管理数据的仓库,对数据进行增删改查操作,其本质是一个软件。 首先数据有两种,一种是关系型数据库,另一种是非关系型数据库。 关系型数据库是以表的形式来存储数据,表和表之间可以有很多复杂的关系&a…...
Anaconda下的 jupyter notebook安装及使用
安装 打开Anaconda Powershell Prompt或Anconda Prompt 输入命令conda install jupyter notebook进行安装 启动 切换到工作目录,输入命令jupyter notebook等待浏览器打开网页 命令行启动jupyter notebook的链接复制到浏览器同样可以打开jupyter notebook 在Ancon…...
C语言初阶(11)
1.结构体定义 结构体就是一群数据类型的集合体。这些数据类型被称为成员变量。结构的成员可以是标量、数组、指针,甚至是其他结构体。 2.结构体的声明和结构体变量命名与初始化 结构体声明由以下结构组成 struct stu {char name[12];int age; }; 结构体命名有两…...
Unity获取Animator动画播放完成事件
整理了一些在日常经验中处理动画播放完成事件的方法 方法: 1.Dotween配合异步实现 2.状态机计时方法实现 3.原生动画行为方法实现 方法一:Dotween异步方法 using UnityEngine; using System.Threading.Tasks; using DG.Tweening;public class PlayerAnimAsync : M…...
git submodule 使用
在Git中,子模块(submodule)是一种将一个Git仓库作为另一个Git仓库的子目录嵌入的方式。这使得主仓库能够跟踪和管理对外部依赖的更改。 添加子模块 初始化父仓库:如果你还没有创建父仓库,先创建它。 添加子模块&…...
【Jenkins未授权访问漏洞 】
默认情况下 Jenkins面板中用户可以选择执行脚本界面来操作一些系统层命令,攻击者可通过未授权访问漏洞或者暴力破解用户密码等进入后台管理服务,通过脚本执行界面从而获取服务器权限。 第一步:使用fofa语句搜索 搜索语句: port&…...
前端处理 Excel 文件
引入XLSX XLSX 是一个流行的 JavaScript 库,用于处理 Excel 文件(包括 .xls 和 .xlsx 格式)。它可以在 Node.js 环境和浏览器中运行,提供了丰富的 API 来读取、写入、修改 Excel 文件。当你使用 import * as XLSX from xlsx; 这行…...
(vue)el-cascader级联选择器按勾选的顺序传值,摆脱层级约束
(vue)el-cascader级联选择器按勾选的顺序传值,摆脱层级约束 需求:按勾选的顺序给后端传值 难点:在 Element UI 的 el-cascader 组件中,默认的行为是根据数据的层级结构来显示选项,用户的选择也会基于这种层级结构,el-…...
Redis进阶(四):哨兵
为了解决主节点故障,需要人工操作切换主从的情况;因此需要一种方法可以自动化的切换:哨兵的引入大大改变这种情况。 哨兵的基本概念 自动切换主从节点 哨兵架构 1、当一个哨兵节点发现主节点挂了的时候,还需要其他节点也去检测一…...
蓝屏事件:网络安全的启示
“微软蓝屏”事件暴露了网络安全哪些问题? 近日,一次由微软视窗系统软件更新引发的全球性“微软蓝屏”事件,不仅成为科技领域的热点新闻,更是一次对全球IT基础设施韧性与安全性的深刻检验。这次事件,源于美国电脑安全技…...
技术方案评审原则
系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录 系列文章目录前言技术方案评审原则1.理论突破阶段2.技术突破阶段3.工程化阶段自动驾驶行业的技术方案分析前言 认知有限,望大家多多包涵,有什么问题也希望能够与大…...
117页PPT埃森哲-物流行业信息化整体规划方案
一、埃森哲-物流行业信息化整体规划方案 资料下载方式,请看每张图片右下角信息 埃森哲在物流行业信息化整体规划项目中的核心内容,旨在帮助物流企业通过信息技术的应用实现业务流程的优化、运营效率的提升以及市场竞争力的增强。以下是埃森哲在此类项目…...
百度网盘不下载怎么直接打印文件?
在数字化时代,百度网盘作为我们存储和分享文件的重要工具,承载了大量的文档、图片和资料。然而,当需要打印这些文件时,很多用户会面临一个共同的问题:不想下载到本地再打印,既占用空间又浪费时间。那么&…...
Vue记事本应用实现教程
文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展:显示创建时间8. 功能扩展:记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...
《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...
最新SpringBoot+SpringCloud+Nacos微服务框架分享
文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的,根据Excel列的需求预估的工时直接打骨折,不要问我为什么,主要…...
使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装
以下是基于 vant-ui(适配 Vue2 版本 )实现截图中照片上传预览、删除功能,并封装成可复用组件的完整代码,包含样式和逻辑实现,可直接在 Vue2 项目中使用: 1. 封装的图片上传组件 ImageUploader.vue <te…...
MySQL账号权限管理指南:安全创建账户与精细授权技巧
在MySQL数据库管理中,合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号? 最小权限原则…...
LeetCode - 199. 二叉树的右视图
题目 199. 二叉树的右视图 - 力扣(LeetCode) 思路 右视图是指从树的右侧看,对于每一层,只能看到该层最右边的节点。实现思路是: 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...
QT3D学习笔记——圆台、圆锥
类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体(对象或容器)QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质(定义颜色、反光等)QFirstPersonC…...
Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...
Linux nano命令的基本使用
参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时,显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...
计算机基础知识解析:从应用到架构的全面拆解
目录 前言 1、 计算机的应用领域:无处不在的数字助手 2、 计算机的进化史:从算盘到量子计算 3、计算机的分类:不止 “台式机和笔记本” 4、计算机的组件:硬件与软件的协同 4.1 硬件:五大核心部件 4.2 软件&#…...
