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

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、基本概念与定义 引用不是新定义一个变量&#xff0c;而是给已存在的变量起一个别名&#xff0c;编译器不会为引用变量开辟内存空间&#xff0c;它和它所引用的变量公用同一块内存空间&#xff1b; 引用的写法&#xff1a;变量类型& 引用别名 变量&#xff…...

Internet Download Manager(IDM)2024中文版本有哪些新功能?6.42版本功能介绍

1. Internet Download Manager&#xff08;IDM&#xff09;是一款功能强大的下载管理器&#xff0c;支持所有流行的浏览器&#xff0c;并可提升下载速度高达5倍。 2. IDM具有智能下载逻辑加速器&#xff0c;可以设置文件下载优先级、分块下载等&#xff0c;提高下载效率。 IDM…...

深入理解 C 语言中的联合体

目录 引言 一、 联合体的定义与基本用法 1.联合体的定义 2.基本用法 二、 联合体与结构体的区别 1.结构体 2.联合体 3.对比 三、联合体的优势 1. 节省内存 2. 提高效率 3. 代码简洁性 四、联合体的存储细节 1.内存对齐 2.大小计算 五、联合体的高级用法 1.匿…...

OpenCV||超详细的几何变换

2D图像几何变换的33矩阵&#xff1a; 图像常见的几何变换&#xff1a; 图像来源&#xff1a;《OpenCV 4.5计算机视觉开发实战&#xff1a;基于Python》作者&#xff1a;朱文伟 李建英&#xff1b; 1. 平移&#xff08;Translation&#xff09; 在OpenCV中&#xff0c;平移不是…...

网络程序设计基础概述

文章目录 前言一、网络程序设计基础二、网络协议 1.IP协议2.TCP与UDP协议三、端口与套接字总结 前言 网络程序设计编写的是与其他计算机进行通信的程序代码。Java将网络程序所需要的东西封装成了不同的类。开发者只需要创建这些类的对象&#xff0c;调用相应的方法&#xff0c;…...

MySQL:数据库用户

数据库用户 在关系型数据库管理系统中&#xff0c;数据库用户&#xff08;USER&#xff09;是指具有特定权限和访问权限的登录账户。每个用户都有自己的用户名和密码&#xff0c;以便系统可以通过认证来识别他们的身份。数据库用户可以登录数据库&#xff0c;在其中执行各种类…...

用TensorFlow训练自己的第一个模型

现在学AI的一个优势就是&#xff1a;前人栽树后人乘凉&#xff0c;很多资料都已完善&#xff0c;而且有很多很棒的开源作品可以学习&#xff0c;感谢大佬们 项目 项目源码地址 视频教程地址 我在大佬的基础上基于此模型还加上了根据特征值缓存进行快速识别的方法&#xff0c;…...

MySQL数据库入门基础知识 【1】推荐

数据库就是储存和管理数据的仓库&#xff0c;对数据进行增删改查操作&#xff0c;其本质是一个软件。 首先数据有两种&#xff0c;一种是关系型数据库&#xff0c;另一种是非关系型数据库。 关系型数据库是以表的形式来存储数据&#xff0c;表和表之间可以有很多复杂的关系&a…...

Anaconda下的 jupyter notebook安装及使用

安装 打开Anaconda Powershell Prompt或Anconda Prompt 输入命令conda install jupyter notebook进行安装 启动 切换到工作目录&#xff0c;输入命令jupyter notebook等待浏览器打开网页 命令行启动jupyter notebook的链接复制到浏览器同样可以打开jupyter notebook 在Ancon…...

C语言初阶(11)

1.结构体定义 结构体就是一群数据类型的集合体。这些数据类型被称为成员变量。结构的成员可以是标量、数组、指针&#xff0c;甚至是其他结构体。 2.结构体的声明和结构体变量命名与初始化 结构体声明由以下结构组成 struct stu {char name[12];int age; }; 结构体命名有两…...

Unity获取Animator动画播放完成事件

整理了一些在日常经验中处理动画播放完成事件的方法 方法: 1.Dotween配合异步实现 2.状态机计时方法实现 3.原生动画行为方法实现 方法一&#xff1a;Dotween异步方法 using UnityEngine; using System.Threading.Tasks; using DG.Tweening;public class PlayerAnimAsync : M…...

git submodule 使用

在Git中&#xff0c;子模块&#xff08;submodule&#xff09;是一种将一个Git仓库作为另一个Git仓库的子目录嵌入的方式。这使得主仓库能够跟踪和管理对外部依赖的更改。 添加子模块 初始化父仓库&#xff1a;如果你还没有创建父仓库&#xff0c;先创建它。 添加子模块&…...

【Jenkins未授权访问漏洞 】

默认情况下 Jenkins面板中用户可以选择执行脚本界面来操作一些系统层命令&#xff0c;攻击者可通过未授权访问漏洞或者暴力破解用户密码等进入后台管理服务&#xff0c;通过脚本执行界面从而获取服务器权限。 第一步&#xff1a;使用fofa语句搜索 搜索语句&#xff1a; port&…...

前端处理 Excel 文件

引入XLSX XLSX 是一个流行的 JavaScript 库&#xff0c;用于处理 Excel 文件&#xff08;包括 .xls 和 .xlsx 格式&#xff09;。它可以在 Node.js 环境和浏览器中运行&#xff0c;提供了丰富的 API 来读取、写入、修改 Excel 文件。当你使用 import * as XLSX from xlsx; 这行…...

(vue)el-cascader级联选择器按勾选的顺序传值,摆脱层级约束

(vue)el-cascader级联选择器按勾选的顺序传值,摆脱层级约束 需求&#xff1a;按勾选的顺序给后端传值 难点&#xff1a;在 Element UI 的 el-cascader 组件中&#xff0c;默认的行为是根据数据的层级结构来显示选项&#xff0c;用户的选择也会基于这种层级结构&#xff0c;el-…...

Redis进阶(四):哨兵

为了解决主节点故障&#xff0c;需要人工操作切换主从的情况&#xff1b;因此需要一种方法可以自动化的切换&#xff1a;哨兵的引入大大改变这种情况。 哨兵的基本概念 自动切换主从节点 哨兵架构 1、当一个哨兵节点发现主节点挂了的时候&#xff0c;还需要其他节点也去检测一…...

蓝屏事件:网络安全的启示

“微软蓝屏”事件暴露了网络安全哪些问题&#xff1f; 近日&#xff0c;一次由微软视窗系统软件更新引发的全球性“微软蓝屏”事件&#xff0c;不仅成为科技领域的热点新闻&#xff0c;更是一次对全球IT基础设施韧性与安全性的深刻检验。这次事件&#xff0c;源于美国电脑安全技…...

技术方案评审原则

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录 系列文章目录前言技术方案评审原则1.理论突破阶段2.技术突破阶段3.工程化阶段自动驾驶行业的技术方案分析前言 认知有限,望大家多多包涵,有什么问题也希望能够与大…...

117页PPT埃森哲-物流行业信息化整体规划方案

一、埃森哲-物流行业信息化整体规划方案 资料下载方式&#xff0c;请看每张图片右下角信息 埃森哲在物流行业信息化整体规划项目中的核心内容&#xff0c;旨在帮助物流企业通过信息技术的应用实现业务流程的优化、运营效率的提升以及市场竞争力的增强。以下是埃森哲在此类项目…...

百度网盘不下载怎么直接打印文件?

在数字化时代&#xff0c;百度网盘作为我们存储和分享文件的重要工具&#xff0c;承载了大量的文档、图片和资料。然而&#xff0c;当需要打印这些文件时&#xff0c;很多用户会面临一个共同的问题&#xff1a;不想下载到本地再打印&#xff0c;既占用空间又浪费时间。那么&…...

CANN/triton-ge-backend性能调优方法论

性能调优方法论 【免费下载链接】triton-inference-server-ge-backend ge-backend基于triton inference server框架实现对接NPU生态&#xff0c;快速实现传统CV\NLP等模型的服务化。 项目地址: https://gitcode.com/cann/triton-inference-server-ge-backend 模型优化有…...

工业踩坑实录(十七):从40分到高分:工业零件OCR,通用模型一上来就给我打脸

从40分到高分&#xff1a;工业零件OCR&#xff0c;通用模型一上来就给我打脸 工业零件上印一行字&#xff0c;你以为直接丢给OCR就能认。现实是&#xff0c;通用模型跑上去&#xff0c;准确率四十来分&#xff0c;跟瞎猜差不多。 2026-05-08 更新&#xff1a; 发这篇文章之前收…...

基于MCP协议构建AI助手与Google Docs的无缝集成方案

1. 项目概述&#xff1a;为AI助手打通Google Docs的“任督二脉” 如果你和我一样&#xff0c;日常重度依赖Google Docs来撰写技术文档、会议纪要或项目规划&#xff0c;同时又希望AI助手&#xff08;比如Cursor或Claude Desktop&#xff09;能直接读取、分析甚至帮你修改这些文…...

关系选择器和关系选择器的复合,简单实用快来看一看吖~

对于关系选择器怎么用到网页上&#xff0c;我们应该先要了解它的一些用法还有其作用&#xff0c;除了关系选择器还有关系选择复合器的应用&#xff0c;这些我们都应该一一来了解一下~首先我们来讲讲关系选择器&#xff0c;对于关系选择器的用法&#xff0c;我们要先了解几个选择…...

PL/SQL Developer从安装到效率翻倍:一份超全的界面美化、代码提示与快捷键配置指南

PL/SQL Developer从安装到效率翻倍&#xff1a;一份超全的界面美化、代码提示与快捷键配置指南 当你每天面对数据库开发工作时&#xff0c;一个得心应手的工具能让你事半功倍。PL/SQL Developer作为Oracle数据库开发的利器&#xff0c;其强大功能远不止于基础连接和执行SQL。本…...

AI眼底疾病诊断:从图像处理到深度学习的技术融合与实践

1. 项目概述&#xff1a;当AI遇见眼底&#xff0c;一场关于“看见”的革命作为一名在医疗影像和计算机视觉交叉领域摸爬滚打了十多年的从业者&#xff0c;我亲眼见证了技术如何一步步改变诊断的范式。今天想和大家深入聊聊的&#xff0c;是“AI在视网膜疾病诊断中的应用”这个既…...

GPT-4核心技术解析与企业级应用实践指南

1. GPT-4技术本质解析GPT-4作为当前最先进的大语言模型之一&#xff0c;其核心架构基于Transformer神经网络。与早期版本相比&#xff0c;它在模型规模、训练数据和算法优化上都有显著提升。具体表现为&#xff1a;参数量达到万亿级别&#xff08;具体数值未公开&#xff09;训…...

大模型参数规模与性能的非线性关系:从规模迷信到精准设计

1. 项目概述&#xff1a;从“大力出奇迹”到“精打细算”的模型规模探索在AI领域&#xff0c;尤其是大语言模型&#xff08;LLM&#xff09;的研发竞赛中&#xff0c;“参数规模”一度被视为衡量模型能力的黄金标准。从业者们普遍信奉“规模定律”&#xff0c;认为只要堆叠更多…...

告别网盘限速烦恼!九大平台直链下载助手LinkSwift使用全攻略

告别网盘限速烦恼&#xff01;九大平台直链下载助手LinkSwift使用全攻略 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 &#xff0c;支持 百度网盘 / 阿里云盘 / 中国移动云盘 …...

深入PyTorch源码:torch.nn.utils.clip_grad_norm_是如何计算并‘裁剪’梯度的?

深入PyTorch源码&#xff1a;torch.nn.utils.clip_grad_norm_的梯度裁剪机制全解析 在深度学习的训练过程中&#xff0c;梯度爆炸是一个常见且棘手的问题。当神经网络的层数加深&#xff0c;参数数量增多时&#xff0c;反向传播过程中梯度可能会呈指数级增长&#xff0c;最终导…...