目录

一、函数的缺省参数

(一)全缺省参数

(二)半缺省参数

二、函数重载

(一)参数类型不同

(二)参数个数不同

(三)参数类型顺序不同

三、引用相关问题

(一)引用的基本概念与初始化

(二)引用在函数中的应用 - 以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++编程中的这些关键知识点,无论是函数特性、引用机制还是编译流程,对于编写高质量、无错误的代码至关重要。在实际编程过程中,不仅要牢记这些理论知识,更要通过大量的实践来加深理解和掌握,在遇到编译错误和运行时问题时,能够依据这些知识快速定位和解决问题,不断提升自己的编程能力。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/899449.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/899449.shtml
英文地址,请注明出处:http://en.pswp.cn/news/899449.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RPCGC阅读

24年的MM 创新 现有点云压缩工作主要集中在保真度优化上。 而在实际应用中&#xff0c;压缩的目的是促进机器分析。例如&#xff0c;在自动驾驶中&#xff0c;有损压缩会显着丢失户外场景的详细信息。在三维重建中&#xff0c;压缩过程也会导致场景数据中语义信息(Contour)的…

泛目录优化:无极泛目录优化网站,技术解析与风险控制指南

无极泛目录优化网站精简版 一、核心功能 无限层级目录&#xff1a;支持动态创建 5 级以上子目录&#xff0c;形成内容矩阵AI 内容生成&#xff1a;集成 GPT-4 接口&#xff0c;日均生产 10 万 原创度 70% 以上的页面SEO 智能检测&#xff1a;自动优化 TDK、URL 结构、图片属…

归档重做日志archived log (明显) 比redo log重做日志文件小

归档重做日志 (明显) 比重做日志文件小。 (文档 ID 1356604.1) 日志切换将由于以下原因发生&#xff1a; 1. 由于在重做日志文件已满之前强制创建存档而记录和设计的行为 SQL> alter system switch logfile;SQL> alter system archive log current;RMAN> backup ar…

645.错误的集合

import java.util.HashMap; import java.util.Map;/*** program: Test* description: 645 错误的集合* author: gyf* create: 2025-03-23 10:22**/ public class Test {public static void main(String[] args) {}public static int[] findErrorNums(int[] nums) {int[] arr n…

力扣刷题494. 目标和

494. 目标和 - 力扣&#xff08;LeetCode&#xff09; 方法一&#xff0c;暴力dfs 直接进行深搜查找出所有的情况&#xff0c;缺点严重超时&#xff0c;只能过20个案例 留一下超时的 class Solution {//首先定义全局变量int[] abs { 1, -1 }; //用来记录当前遍历的数的正…

一周学会Flask3 Python Web开发-SQLAlchemy数据迁移migrate

锋哥原创的Flask3 Python Web开发 Flask3视频教程&#xff1a; 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 模型类(表)不是一成不变的&#xff0c;当你添加了新的模型类&#xff0c;或是在模型类中添加了新的字段&#xff0c;甚至是修改…

Python练习之抽奖界面

前言 一、代码整体架构分析 1、数据层 (Model) 2、控制层 (Controller) 3、视图层 (View) 二、核心功能实现详解 1、 文件导入功能 1.1、实现逻辑 1.2、代码涉及知识点讲解 1.2.1、wildcard 1.2.2、wx.FileDialog 1.2.3、dlg.ShowModal() 2、抽奖动画控制 1.1、…

【云原生】docker 搭建单机PostgreSQL操作详解

目录 一、前言 二、前置准备 2.1 服务器环境 2.2 docker环境 三、docker安装PostgreSQL过程 3.1 获取PostgreSQL镜像 3.2 启动容器 3.2.1 创建数据卷目录 3.2.2 启动pg容器 3.3 客户端测试连接数据库 四、创建数据库与授权 4.1 进入PG容器 4.2 PG常用操作命令 4.2…

算法为舟 思想为楫:AI时代,创作何为?

在科技浪潮汹涌澎湃的当下,AI技术以前所未有的态势席卷各个领域,创作领域亦未能幸免。当生成式AI展现出在剧本撰写、诗歌创作、图像设计等方面的惊人能力时,人类创作者仿佛置身于文明演化的十字路口,迷茫与困惑交织,兴奋与担忧并存。在AI时代,创作究竟该何去何从?这不仅…

JAVA的内存图理解

目录 一、方法区1、类常量池2、静态常量池3、方法区过程 二、栈三、堆1、字符常量池2、堆内存图的绘制 java中内存可以分为 方法区、 堆、 栈、 程序计数器、 本地方法栈&#xff0c;其中比较中重要的是方法区、堆、栈。 一、方法区 1.方法区&#xff08;Method Area&…

基于Selenium的IEEE Xplore论文数据爬取实战指南

基于Selenium的IEEE Xplore论文数据爬取实战指南 一、项目背景与目标 IEEE Xplore作为全球知名的学术资源平台,收录了大量高质量科技文献。本教程将演示如何通过Python的Selenium库实现: 自动化获取指定领域论文列表(以"构音障碍"为例)完整提取论文标题、摘要、…

软件工程面试题(十二)

1、文件和目录(i/o)操作,怎么列出某目录下所有文件?某目录下所有子目录,怎么判断文件或目录是否存在?如何读写文件? 列出某目录下所有文件:调用listFile(),然后判断每个File对象是否是文件可以调用 isFile(),判断是否是文件夹可以调用isDirectory(),判断文件或目…

医疗CMS高效管理:简化更新维护流程

内容概要 医疗行业内容管理系统&#xff08;CMS&#xff09;的核心价值在于应对医疗信息管理的多维复杂性。面对诊疗指南的动态更新、科研数据的快速迭代以及多机构协作需求&#xff0c;传统管理模式往往面临效率瓶颈与合规风险。现代化医疗CMS通过构建结构化权限管理矩阵&…

谈谈Minor GC、Major GC和Full GC

目录 一、背景 二、三者之间的区分 1、Minor GC 2、Major GC &#xff08;1&#xff09;老年代空间不足&#xff1a; &#xff08;2&#xff09;晋升&#xff08;Promotion&#xff09;失败&#xff1a; &#xff08;3&#xff09;空间分配担保失败&#xff1a; &#x…

C盘清理技巧分享:PE Dism++ 空间清理篇

C盘清理技巧分享&#xff1a;PE & Dism 空间清理篇 C盘空间不足是许多用户面临的常见问题&#xff0c;尤其是在使用 Windows 系统时。本文将重点介绍如何使用 PE&#xff08;Preinstallation Environment&#xff09;和 Dism 工具高效清理 C盘空间&#xff0c;释放宝贵的存…

低功耗LPWAN模块开发指南:远距离无线通信与边缘计算融合实战‌

在远程资产追踪、野外环境监测等场景中&#xff0c;稳定可靠的长距离通信与超低功耗是系统设计的核心挑战。eFish-SBC-RK3576通过 ‌原生双UART接口 USB OTG扩展能力‌ &#xff0c;可无缝集成主流LPWAN模组&#xff08;LoRa/NB-IoT&#xff09;&#xff0c;实现“数据采集-边…

迅为iTOP-RK3576人工智能开发板Android 系统接口功能测试

2.1 开机启动 开发板接通电源&#xff0c;并按下电源开关&#xff0c;系统即启动&#xff0c;在启动过程中&#xff0c;系统会显示下图中的开机画面&#xff0c;它们分别是 Android 系统启动时的 Logo 画面&#xff1a; 最后会显示如下解锁画面&#xff1a; 2.2 命令终端 将…

RAG基建之PDF解析的“无OCR”魔法之旅

PDF文件转换成其他格式常常是个大难题,大量的信息被锁在PDF里,AI应用无法直接访问。如果能把PDF文件或其对应的图像转换成结构化或半结构化的机器可读格式,那就能大大缓解这个问题,同时也能显著增强人工智能应用的知识库。 嘿,各位AI探险家们!今天我们将踏上了一段奇妙的…

二层框架组合实验

实验要求&#xff1a; 1,内网IP地址使用172.16.0.0/16分配 2,SW1和sw2之间互为备份 3,VRRP/STP/VLAN/Eth-trunk均使用 4,所有PC均通过DHCP获取IP地址 5,ISP只能配置IP地址 6,所有电脑可以正常访问ISP路由器环回 实验思路顺序&#xff1a; 创建vlan eth-trunk 划分v…

光纤耦合器

以下是关于光纤耦合器的详细介绍&#xff1a; 定义与原理 - 定义&#xff1a;光纤耦合器是一种能使传输中的光信号在特殊结构的耦合区发生耦合&#xff0c;并进行再分配的器件&#xff0c;也叫分歧器、连接器、适配器、光纤法兰盘。 - 原理&#xff1a;利用不同光纤面紧邻光纤芯…