C++编程学习笔记:函数相关特性、引用与编译流程
目录
一、函数的缺省参数
(一)全缺省参数
(二)半缺省参数
二、函数重载
(一)参数类型不同
(二)参数个数不同
(三)参数类型顺序不同
三、引用相关问题
(一)引用的基本概念与初始化
(二)引用在函数中的应用 - 以Swap函数为例
1. 普通变量交换(值传递方式存在问题)
2. 使用指针引用实现交换
3. 使用普通引用实现交换(更简洁常用)
四、C++编译流程
(一)预处理
(二)编译
(三)汇编
(四)链接
在深入学习C++编程的过程中,函数特性、引用机制以及编译流程都是极为关键的知识点。通过学习,我对这些内容有了更为透彻的理解,在此进行详细梳理与记录。
一、函数的缺省参数
(一)全缺省参数
全缺省参数意味着函数的所有参数都具备默认值。以下是示例代码:
cppvoid Func(int a = 10, int b = 20, int c = 30){cout << "a = " << a << endl;cout << "b = " << b << endl;cout << "c = " << c << endl;}
当调用此函数时,若不传入参数,函数会自动采用默认值。比如执行 Func() ,将输出 a = 10 、 b = 20 、 c = 30 。这一特性在很多场景下能为函数调用提供便利,减少重复的参数输入。
(二)半缺省参数
半缺省参数是指函数部分参数拥有默认值。代码示例如下:
cppvoid Func(int a, int b = 10, int c = 20){cout << "a = " << a << endl;cout << "b = " << b << endl;cout << "c = " << c << endl;}
需要特别注意的是,半缺省参数必须遵循从右至左的顺序依次给出,不能出现间隔的情况。并且,缺省参数不能在函数声明和定义中同时存在。这是C++语法的严格规定,违背此规则会导致编译错误。
二、函数重载
函数重载允许在同一作用域内,存在多个同名但参数列表(参数类型、个数、顺序)不同的函数。以下是具体示例:
(一)参数类型不同
cppint Add(int left, int right){cout << "int Add(int left, int right)" << endl;return left + right;}double Add(double left, double right){cout << "double Add(double left, double right)" << endl;return left + right;}
上述代码中,两个 Add 函数虽然名字相同,但一个处理 int 类型参数,一个处理 double 类型参数,构成了函数重载。
(二)参数个数不同
cppvoid f(){cout << "f()" << endl;}void f(int a){cout << "f(int a)" << endl;}
这里两个 f 函数,一个无参数,一个带有 int 类型参数,体现了因参数个数不同而形成的函数重载。
(三)参数类型顺序不同
cppvoid f(int a, char b){cout << "f(int a,char b)" << endl;}void f(char b, int a){cout << "f(char b,int a)" << endl;}
这两个 f 函数参数类型相同,但顺序不同,同样构成函数重载。
然而,函数重载也可能引发调用歧义问题。例如:
cppvoid f(){cout << "f()" << endl;}void f(int a = 0){cout << "f(int a)" << endl;}int main(){f(); // 此处调用会出现歧义,编译器无法确定调用哪个函数return 0;}
在此情形下,编译器难以抉择要调用哪个 f 函数,从而报错。这就要求我们在使用函数重载时,要谨慎考虑,避免出现这种不明确的调用情况。
三、引用相关问题
(一)引用的基本概念与初始化
在C++中,引用实际上是给变量取的一个别名。示例如下:
cppint a = 0;int& b = a;int& c = b;
这里 b 和 c 均为 a 的引用。需要着重强调的是,引用在定义时必须进行初始化。像 int& d; 这种未初始化的引用是不符合语法规则的,编译器会报错,提示如 C2530 “d”: 必须初始化引用 。这是因为引用本质上是变量的别名,必须在定义时明确其关联的变量。
(二)引用在函数中的应用 - 以Swap函数为例
1. 普通变量交换(值传递方式存在问题)
最初尝试实现交换两个整数变量值的函数时,若采用值传递方式,代码如下:
cppvoid Swap(int a, int b){int tmp = a;a = b;b = tmp;}int main(){int x = 0, y = 1;Swap(x, y);cout << x << " " << y << endl; // 输出结果仍为0 1,未实现交换return 0;}
这种方式无法真正实现变量值的交换,原因在于函数内交换的只是形参 a 和 b 的值,而实参 x 和 y 并未受到影响,因为形参是实参的副本,函数结束后副本的改变不会反馈到实参上。
2. 使用指针引用实现交换
为解决上述问题,可使用指针引用的方式,代码如下:
cppvoid Swap(int*& a, int*& b){int* tmp = a;a = b;b = tmp;}int main(){int x = 0, y = 1;int* px = &x, * py = &y;cout << px << " " << py << endl;Swap(px, py);cout << px << " " << py << endl;return 0;}
这里函数参数是指针的引用,通过这种方式可以直接操作指针本身,实现指针所指向变量地址的交换。
3. 使用普通引用实现交换(更简洁常用)
更为简洁常用的方式是使用普通引用,代码如下:
cppvoid Swap(int& a, int& b){int tmp = a;a = b;b = tmp;}int main(){int x = 0, y = 1;Swap(x, y);cout << x << " " << y << endl; // 输出1 0,成功实现交换return 0;}
在这个版本中, Swap 函数接收的是变量的引用,函数内部对形参的操作等同于对实参的操作,从而顺利实现了两个整数变量值的交换。
四、C++编译流程
(一)预处理
预处理阶段承担着多项重要任务,包括头文件展开、宏替换、条件编译以及去掉注释等操作。假设有 Stack.h 、 Stack.cpp 、 Test.cpp 等文件,经过预处理后,会生成 Stack.i 和 Test.i 。这一阶段为后续的编译工作做了前期的准备,将代码整理成更便于编译器处理的形式。
(二)编译
编译阶段主要是对代码进行语法检查,并生成汇编代码。在此过程中,会生成 Stack.s 和 Test.s 文件。如果代码中存在语法错误,就会在这个阶段被编译器检测出来并报错。语法检查涵盖了对变量声明、语句结构、函数调用等多方面的规则校验,只有通过语法检查的代码才能顺利进入后续阶段。
(三)汇编
汇编阶段的任务是将汇编代码转换成二进制机器码,生成 Stack.o 和 Test.o 目标文件。这是将高级语言逐步转化为机器能够直接执行的指令的关键步骤,二进制机器码是计算机硬件能够直接理解和执行的指令形式。
(四)链接
链接阶段会把各个目标文件以及所依赖的库文件等进行链接,最终生成可执行程序(如 xxx.exe 或 a.out )。在链接过程中,会处理函数的声明和定义之间的关联,找到函数的具体实现位置。例如,在多个源文件中调用的函数,链接器会确保函数的声明和定义能够正确匹配,使得程序在运行时能够准确找到并执行相应的函数代码。
理解C++编程中的这些关键知识点,无论是函数特性、引用机制还是编译流程,对于编写高质量、无错误的代码至关重要。在实际编程过程中,不仅要牢记这些理论知识,更要通过大量的实践来加深理解和掌握,在遇到编译错误和运行时问题时,能够依据这些知识快速定位和解决问题,不断提升自己的编程能力。
相关文章:
C++编程学习笔记:函数相关特性、引用与编译流程
目录 一、函数的缺省参数 (一)全缺省参数 (二)半缺省参数 二、函数重载 (一)参数类型不同 (二)参数个数不同 (三)参数类型顺序不同 三、引用相关问题…...
Nginx 配置 HTTPS 与 WSS 完整指南
Nginx 配置 HTTPS 与 WSS 完整指南 本教程将手把手教你如何为网站配置 HTTPS 加密访问,并通过反向代理实现安全的 WebSocket(WSS)通信。以 https://www.zhegepai.cn 域名为例,完整流程约需 30 分钟完成。 一、前置准备 1.1 域名…...
链表基本操作
文章目录 1、单链表1.1 链表的创建1.2 链表的遍历1.3 链表的删除1.4 链表的插入1.5 链表和数组 2、双向链表2.1 双链表的创建2.2 双链表的删除2.3 双链表的插入2.4 双向循环链表2.5 双链表优缺点 1、单链表 链表是一种物理存储单元上非连续、非顺序的存储结构,插入…...
【huggingface 数据下载】ssh / https 不同的下载流程,hf 镜像下载注意事项
ssh 下载流程 在 linux 服务器上生成 ssh key将 pub key 放入 huggingface 的 setting 中通过 git lfs install 然后 git clone githf.co … 来下载数据 遇到的问题 一直卡在 Updating files 后 卡住的可能原因: 系统当前限制了允许监视的最大文件数࿱…...
简单版CentOS7配置haproxy
一、实验步骤 1、自行下载pes的tar包 然后解压到家目录下 tar -xzvf pes.tar.gz 2、创建一个目录 mkdir docker-compose-pes-lb2 3、在这个目录下写两个文件docker-compose.yml和haproxy.cfg docker-compose.yml version: 3 services: db: image: mysql:5.7.44 container…...
leetcode146.LRU缓存
思路源自 【面试高频】146. LRU 缓存 采用哈希表双向链表 put一个键值对时,采用头插法将缓存块置于等级较高的位置,如果put数量超出限制,那么就将尾部的缓存块删除,以此达到置换的一个效果 get一个键值对也是同样的思路…...
SpringIoC和DI
文章目录 OCP开闭原则DIP(依赖倒置原则)IOC(控制反转)依赖注入DI基于XML配置Beanset注入构造注入 使用注解存储beanController方法注解Bean扫描路径依赖注入三种注入方式优缺点分析 引入 当我们写了一个程序,遵循SpringMVC三层架构,表现层调用业务逻辑层…...
vue 路由
目录 一、路由的使用 二、声明式导航 2.1 声明式导航 2.2 声明式导航路由传参 2.2.1.字符串写法 2.2.2.对象写法 2.2.3 query 传参和 param 传参总结 2.3 命名路由 2.4 可选操作符 2.5 props 参数 三、编程式导航 3.1 replace 和 push 跳转…...
JAVA常见的 JVM 参数及其典型默认值
在 Java 线上应用中,JVM 参数的默认值取决于具体的 JVM 实现(如 Oracle JDK、OpenJDK、Zulu 等)、版本(如 Java 8、11、17 等)以及运行环境(物理机、容器等)。以下是常见的 JVM 参数及其典型默认…...
文件压缩与解压(zip4j)
maven依赖 <dependency><groupId>net.lingala.zip4j</groupId><artifactId>zip4j</artifactId><version>2.11.5</version></dependency>示例 //参数配置ZipParameters parameters new ZipParameters();parameters.setCompres…...
【操作系统】查内存泄漏方法
【操作系统】查内存泄漏方法 1. 通用检测方法1.1 代码审查1.2 运行时监测 2.Linux平台检测工具2.1 Valgrind工具套件2.2 AddressSanitizer (ASan)2.3 mtrace 3.Windows平台检测工具3.1 Visual Studio诊断工具3.2 CRT调试堆 4.嵌入式系统检测方法4.1 RT-Thread内存检测4.2 自定义…...
oracle常用sql
获取主键 1. 查询主键的两种常用方法 Oracle 的主键信息存储在以下两个视图中: USER_CONSTRAINTS:存储当前用户下所有表的约束信息(如主键、外键等)。 USER_CONS_COLUMNS:存储约束对应的列信息。 方法 1ÿ…...
【第十三届“泰迪杯”数据挖掘挑战赛】【2025泰迪杯】【思路篇】A题解题全流程(持续更新)
【第十三届“泰迪杯”数据挖掘挑战赛】【2025泰迪杯】A题解题全流程-思路(持续更新) 写在前面: 1、A题、C题将会持续更新,陆续更新发布文章 2、赛题交流咨询Q群:1037590285 3、全家桶依旧包含: 代码、…...
Qt 信号量使用方法
Qt 信号量使用方法 QSemaphore 类 常用函数介绍 函数名称函数功能QSemaphore()构造并初始化对象acquire()尝试获取n个资源,如果没有那么多资源,线程将阻塞直到有n个资源可用available()返回当前信号量可用的资源个数,这个数永远不可能为负…...
C++进阶——封装哈希表实现unordered_map/set
与红黑树封装map/set基本相似,只是unordered_map/set是单向迭代器,模板多传一个HashFunc。 目录 1、源码及框架分析 2、模拟实现unordered_map/set 2.1 复用的哈希表框架及Insert 2.2 iterator的实现 2.2.1 iteartor的核心源码 2.2.2 iterator的实…...
AI Agent 实战:搭建个人在线旅游助手
AI Agent 实战:搭建个人在线旅游助手 本次实验中,我们将继续探索 Agent 的提示词,学习更加规范的提示词撰写方法。 本实验中你将掌握的知识点 使用 Dify 构建 Agent 的方法结构化的提示词撰写技巧变量的使用方法 1. 准备 在新建 Agent 之…...
CSS中的overflow属性
在 CSS 中,overflow 属性用于控制当一个元素的内容溢出其指定的区域时,应该如何处理溢出的部分。通常用于盒模型(如 div)中,指定内容超出容器时的显示方式。 overflow 属性的常用值: 1. visible(…...
【Unity】处理文字显示不全的问题
1.选中字体文件,检查 MultiAtlasTeextures 是否勾选,未勾选的话,先勾选保存后查看是否显示正常 2.勾选后未正常显示,则在搜索框中输入未显示的文本,确认字体图集是否包含该文本,然后点击Update Atlas Textu…...
蓝桥备赛指南(11):递归简介
递归的介绍 概念:递归是指函数直接或间接调用自身的过程。 解释递归的两个关键要素: 基本情况(递归终止条件):递归函数中的一个条件,当满足该条件时,递归终止,避免无限递归。可以…...
Python 图片水印处理工具
自定义水印文本自定义水印位置支持图片裁剪支持各种图片格式 from PIL import Image, ImageDraw, ImageFont import osclass ImageWatermarker:def __init__(self, font_pathNone, font_size40):"""初始化水印处理器font_path: 字体文件路径,默认使…...
从零开始:如何打造一套完整的UI设计系统?
1. 建立色彩系统 色彩系统是设计系统的基础之一,它不仅影响界面的整体美感,还对用户体验有着深远的影响。首先,设计师需要定义主色调、辅助色和强调色,并确保这些颜色在不同场景下的应用保持一致。使用工具如Adobe Color或Coolor…...
Jenkins + CICD流程一键自动部署Vue前端项目(保姆级)
git仓库地址:参考以下代码完成,或者采用自己的代码。 南泽/cicd-test 拉取项目代码到本地 使用云服务器或虚拟机采用docker部署jenkins 安装docker过程省略 采用docker部署jenkins,注意这里的命令,一定要映射docker路径,否则无…...
c# 虚函数、接口、抽象区别和应用场景
文章目录 定义和语法实现要求继承和使用场景总结访问修饰符设计目的性能扩展性在 C# 里,虚函数、接口和抽象函数都能助力实现多态性,不过它们的定义、使用场景和特点存在差异,下面为你详细剖析: 定义和语法 虚函数:虚函数在基类里定义,使用 virtual 关键字,且有默认的实…...
数据治理的主题库是做什么的
数据治理的主题库详解 一、定义与核心概念 主题库是数据治理体系中的核心组件,指围绕某一业务主题或实体对象,通过数据清洗、整合、标准化等手段形成的逻辑化、高质量数据集。其核心特征包括: 主题导向:以业务领域(…...
pytorch模型的进阶训练和性能优化
综合案例 将MNIST数据集保存成本地图片读取本地图片进行训练读取自己的数据集进行训练用自己的模型进行训练获得更多评价指标提升模型性能的方法 MNIST转本地图片 import os import torchvision import torchvision.transforms as transforms# 下载MNIST数据集 transform t…...
i18next在vue3中的应用,可参考写法或直接复用
i18next是一个国际化相关的的依赖,适配多种框,比如vue2/3,react,next.js等等,是一个非常实用的依赖。在一次项目中接触过i18n相关内容,因此今天就整理一下这个通用的插件。 官网:Introduction …...
DM数据迁移工具
DM数据迁移工具 一、概述二、迁移准备三、启动迁移工具1.Windows 环境启动 DM 数据迁移工具2.Linux 环境启动 DM 数据迁移工具2.1启用图形化安装界面前需要通过如下命令将图形界面权限放开:2.2进入数据库安装路径 /tool 目录下,运行 ./dts 即可启动 DM 数…...
Python入门(4):函数
目录 1 基本概念 1.1 函数的定义与调用 2 函数的参数 2.1 位置参数(Positional Arguments) 2.2 默认参数(Default Arguments) 2.3 关键字参数(Keyword Arguments) **2.4 可变参数(*…...
Java基础-25-继承-方法重写-子类构造器的特点-构造器this的调用
在面向对象编程中,继承是实现代码复用和扩展的重要机制。通过继承,子类可以继承父类的属性和方法,并且可以通过方法重写来改变或扩展父类的行为。此外,构造器在对象初始化过程中扮演了重要角色,尤其是在子类构造器中如…...
Mysql之事务(上)
🏝️专栏:Mysql_猫咪-9527的博客-CSDN博客 🌅主页:猫咪-9527-CSDN博客 “欲穷千里目,更上一层楼。会当凌绝顶,一览众山小。” 目录 1.什么需要为事务? 2.事务的四个特性 1. 原子性࿰…...
2025华为软件精英挑战赛2600w思路分享
这里写自定义目录标题 得分展示对象定义请求价值计算时间同步删除操作完整思路 得分展示 对象定义 // 将一个磁盘划分为多个基于标签聚合的区块 class Block{ public:int tag 0; // 区块标签int start_pos;int end_pos;int id;int use_size 0;int v;// 为区块确定范围Bloc…...
LSTM网络是什么?
环境: LSTM网络 问题描述: LSTM网络是什么? 解决方案: LSTM 网络解释 LSTM(Long Short-Term Memory)网络 是一种特殊的递归神经网络(RNN),能够学习长期依赖关系。L…...
bert自然语言处理框架
自然语言处理框架 目录 自然语言处理框架bert自然语言处理框架概念核心特点应用场景 框架和数据集结构编码-解码框架Self-Attention 机制multi-headed机制位置编码Add与Normalize整体框架outputs训练数据集 bert自然语言处理框架 概念 BERT(Bidirectional Encoder …...
UE5学习笔记 FPS游戏制作33 游戏保存
文章目录 核心思想创建数据对象创建UIUI参数和方法打开UI存档文件的位置可以保存的数据类型 核心思想 UE自己有保存游戏的功能,核心节点,类似于json操作,需要一个数据类的对象来进行保存和读取 创建存档 加载存档 保存存档 创建数据对象…...
【超详细】一文解决更新小米澎湃2.0后LSPose失效问题
【超详细】一文解决更新澎湃2.0后LSPose失效问题 问题分析: 出现这个问题大多是因为本次为大版本更新A14->A15,因此原来的LSPose无法支持新系统特性导致的,因此我们从此出发解决这个问题。 方案一(magisk): 直接…...
Python爬虫教程007:scrapy结合实际案例的简单使用
文章目录 3.1 scrapy安装3.2 scrapy的基本使用3.2.1 scrapy项目的创建和运行3.3 58同城案例3.3.1 创建案例3.3.2 项目结构说明3.4 汽车之家案例3.1 scrapy安装 什么是scrapy: Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。可以应用在包括数据挖掘、信息处…...
【可能性:如何从已有条件中分析一件事情是否会发生? 关键字摘抄】
是否可以直接从前提条件给出的信息中,推理出一件事情是否会发生呢?还真的可以,这一讲,我们就来说说,什么是逻辑上的必然性,可能性和排他性。 白马非马? 春秋战国百家争鸣时期,名家…...
WPS JS宏编程教程(从基础到进阶)-- 第四部分:函数与自定义功能开发
第四部分:函数与自定义功能开发 1. 函数的创建与调用**基础概念****1.1 命名函数与匿名函数****命名函数示例:计算矩形面积****匿名函数示例:动态赋值****1.2 箭头函数****特点**:简化语法,自动继承外层 `this`。2. 自定义函数实战**2.1 身份证信息提取函数****功能**:从…...
Pytorch 张量操作
在深度学习中,数据的表示和处理是至关重要的。PyTorch 作为一个强大的深度学习框架,其核心数据结构是张量(Tensor)。张量是一个多维数组,类似于 NumPy 的数组,但具有更强大的功能,尤其是在 GPU …...
constant(safe-area-inset-bottom)和env(safe-area-inset-bottom)在uniapp中的使用方法解析
在微信小程序中,padding-bottom: constant(safe-area-inset-bottom); 和 padding-bottom: env(safe-area-inset-bottom); 这两个 CSS 属性用于处理 iPhone X 及更高版本设备的安全区域(safe area)。这些设备的底部有一个“Home Indicator”&a…...
ROS相关学习笔记
以下是创建并初始化一个新的 catkin 工作空间的具体步骤 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src catkin_init_workspace #这会在 src 目录下创建一个 CMakeLists.txt 文件 构建工作空间 进入工作空间根目录并构建 cd ~/catkin_ws catkin_make 或者,…...
大模型专题10 —LangGraph高级教程:构建支持网页搜索+人工干预的可追溯对话系统
在本教程中,我们将使用 LangGraph 构建一个支持聊天机器人,该机器人能够: ✅ 通过搜索网络回答常见问题 ✅ 在多次调用之间保持对话状态 ✅ 将复杂查询路由给人工进行审核 ✅ 使用自定义状态来控制其行为 ✅ 进行回溯并探索替代的对话路径 我们将从一个基础的聊天机器人开…...
rbpf虚拟机-汇编和反汇编器
文章目录 一、概述二、主要功能三、关键函数解析3.1 汇编器3.1.1 parse -转换为Instruction列表3.1.2 assemble_internal-转换为Insn 3.2 反汇编器3.2.1 to_insn_vec-转换为机器指令 四、总结 Welcome to Code Blocks blog 本篇文章主要介绍了 [rbpf虚拟机-汇编和反汇编器] ❤…...
压测数据说话:如何用科学方法选择最优高防套餐?
一、压测数据到高防参数的映射规则 1. 带宽需求计算 所需防护带宽 压测崩溃带宽 安全系数(建议1.5倍) 示例:测试崩溃值50Gbps → 选择75G套餐(群联资费表“100G套餐¥8,500/月”) 2. 连接数容量评估 …...
【初阶数据结构】队列
文章目录 目录 一、概念与结构 二、队列的实现 队列的定义 1.初始化 2.入队列 3.判断队列是否为空 4.出队列 5.取队头数据 6.取队尾数据 7.队列有效个数 8.销毁队列 三.完整源码 总结 一、概念与结构 概念:只允许在一端进行插入数据操作,在另一端进行删除…...
ai说js的instanceof是什么怎么用
instanceof 是一个用于检测对象是否是某个构造函数的实例的操作符 (1)检测内置类型 对于 JavaScript 的内置类型,instanceof 可以用来检测对象是否是某种内置类型的实例。 let arr [1, 2, 3]; console.log(arr instanceof Array); // tru…...
PyTorch中知识蒸馏浅讲
知识蒸馏 在 PyTorch 中,使用 teacher_model.eval() 和冻结教师模型参数是知识蒸馏(Knowledge Distillation)中的关键步骤。 1. teacher_model.eval() 的作用 目的: 将教师模型切换到评估模式,影响某些特定层(如 Dropout、BatchNorm)的行为。 具体影响: Dropo…...
服务器自动备份到本地,服务器自动备份到本地的方法有哪些?
服务器自动备份到本地是确保数据安全和系统恢复能力的关键步骤。以下是几种常见的服务器自动备份到本地的方法: 一、使用系统自带的备份工具 Windows Server Windows Server Backup 简介:Windows Server Backup是Windows Server操作系统内置的备份和…...
Vue+Elementui首页看板
源码 <template><!-- 查询条件--><div class="optimize-norm" v-loading="selectDataLoading"><el-form :model="queryParams" ref="queryRef" style="padding-bottom:8px" :inline="true"…...
力扣HOT100之链表:141. 环形链表
这道题都已经刷烂了,没啥好说的,就是定义快慢指针,慢指针每次移动一步,快指针每次移动两步,如果链表中有环,那么快指针一定会追上慢指针,追上时直接返回true,否则快指针会直接到达链…...