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

【C++课程学习】:C++入门(函数重载)

🎁个人主页:我们的五年

🔍系列专栏:C++课程学习

🎉欢迎大家点赞👍评论📝收藏⭐文章

 

目录

🌈函数重载:

🍉1.参数个数不同:

🍉2.参数的类型不同:

🍉3.参数类型顺序不同:

🌈函数名修饰规则:

 🌈链接:


 

 前言:

本篇文章是上一篇文章C++入门(输入输出,缺省)其他C++入门知识。在这里感谢大家的支持,让我们一起进步。

🌈函数重载:

不同的话在不同的情况下会有不同的语义。函数也是一样的,有很多个名字一样的函数,但是在不同的情况下,调用的函数不同。

看一下函数重载的定义:

函数重载:是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表( 参数个数 类型 类型顺序 )不同,常用来处理实现功能类似数据类型不同的问题。
返回值类型不同是不构成函数重载的。(因为编译器无法区分)

同名函数的形参列表不同的三个方面:

下面三种情况,只要满足一种,就构成函数重载。

🍉1.参数个数不同:

看下面的代码:

#include<iostream>
using namespace std;//形参的个数不同
//没有形参
void print()
{cout << "print()" << endl;
}
//一个int形参
void print(int a)
{cout <<"print(int a)" << endl;
}
//两个int形参
void print(int a,int b)
{cout <<"print(int a,int b)"<<endl;
}int main()
{print();print(10);print(20,20);
}

🍉2.参数的类型不同:

下面print函数中:没有参数,只有一个int参数,只有一个double参数

#include<iostream>
using namespace std;//形参的类型不同
void print()
{cout << "print()" << endl;
}
//一个int形参
void print(int a)
{cout << "print(int a)" << endl;
}
//一个double形参
void print(double a)
{cout <<"print(double a)" << endl;
}int main()
{print();print(10);print(3.14);
}

 

🍉3.参数类型顺序不同:

#include<iostream>
using namespace std;//形参的类型顺序不同
//顺序为int,char
void print(int a,char b)
{cout << "int a,char b" << endl;
}//顺序为char,int
void print(char a,int b)
{cout << "char a,int b" << endl;
}int main()
{print(1, 'c');print('c', 1);
}


那么这里就有一个问题:

为什么我们之前在学C语言的时候,我们没有学函数重载?

因为C语言是不支持函数重载的,C++是支持函数重载的。那问题又来了,为什么C语言不支持函数重载,C++支持函数重载?

这是因为C语言函数修饰只有函数名,只有函数名不同时才能区分。但是C++中,函数修饰要加上函数的形参,也就是说,名字一样的函数,当形参链表不同时,函数就是不同的,编译器就可以分辨出来。

不同的编译器,函数名修饰规则不同。

🌈函数名修饰规则:

当我们调用一个函数的时候,编译器是怎么去找这个函数的呢?
这里我们先来讲函数名修饰规则:

在C语言中函数的名称就是函数名,没有在这基础上加其他的信息。

但是在C++中,函数名的修饰还要加上其参数列表。

下面来看看linus下的C语言函数名的修饰和C++函数名的修饰:

1.C语言:

C语言编译完以后,就函数名称还是Add,和func,没有做其他的改变

2.C++:

Linux下,采用gcc编译,C++的修饰规则是【_z+函数长度+函数名+类型首字母】。(如果是指针的话,一级指针是p类型)

在C++中,我们可以很明显的发现,函数名除了Add以外还加了其他的东西,Add前面加了_z+函数名长度,在Add后面加了ii。然后我们看Add函数的参数,发现是两个int,然后我们是不是就可以推测,函数名是不是在后面还会加上参数的开头字母。

我们再来看看func函数,发现前面还是_z,func的长度为4,所以就是_z4。然后后面增加了idpi,i对应int,d对应double,pi对应int*。好像确实是没有什么问题的,所以C++中确实把函数形参也放在函数名里面,用以区分函数名相同,不同参数列表的函数(重载函数)。

 vs上的修饰规则比较复杂,我们后面再来讲解。


 🌈链接:

我们把代码写完,然后让编译器去翻译,然后执行就可以运行我们的代码。

我们调用一个函数,每个函数有不同的函数名,我们就可以通过符号表中寻找函数,找到函数的地址。正常情况下,我们会写很多个.c和.h文件,每个文件都会生成自己的目标文件。去找函数的地址就是发生在编译后链接前。

如果我们在a.c文件种使用了b.c文件中的Add函数,因为Add函数在a.c文件种没有定义,所以在a.c中是找不到的,在链接的时候,要去b.c文件的符号表中才能找到Add函数的地址,从而链表在一起。

相关文章:

【C++课程学习】:C++入门(函数重载)

&#x1f381;个人主页&#xff1a;我们的五年 &#x1f50d;系列专栏&#xff1a;C课程学习 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 目录 &#x1f308;函数重载&#xff1a; &#x1f349;1.参数个数不同&#xff1a; &#x1f349;2.参数…...

skywalking介绍及搭建

链路追踪框架比对&#xff1a; skywalking安装部署&#xff1a; 下载地址&#xff1a;Downloads | Apache SkyWalking 配置微服务与skywalking整合&#xff1a; copy agent/optional-plugins/apm-spring-cloud-getway-xx.jar到plugins&#xff0c;然后重启skywalking 监控界面…...

分析示例 | Simufact焊接工艺仿真变形精确预测汽车结构

导语 焊接是汽车制造过程中一个关键环节&#xff0c;白车身、发动机、底盘和变速箱等都离不开焊接工艺的应用&#xff0c;主要涉及气保焊、电阻点焊、激光焊、电子束焊等多种焊接工艺。由于汽车车型众多、成形结构复杂、汽车制造质量、效率、成本等方面的综合要求。如何高效、…...

模式识别选择题

影响K-均值聚类算法效果的主要因素之一是什么&#xff1f; A. 初始聚类中心的选取 B. 样本输入顺序 C. 模式相似性测度 D. 分类准则 答案&#xff1a;A支持向量机&#xff08;SVM&#xff09;在处理非线性问题时&#xff0c;通常使用什么方法&#xff1f; A. 引入核函数 B. 增加…...

【Java基础】线程方法

start()&#xff1a;启动线程&#xff0c;使线程进入就绪状态。 run()&#xff1a;线程执行的代码逻辑&#xff0c;需要重写该方法。 停止线程 void interrupt() 中断线程&#xff0c;让它重新去争抢cpu 如果目标线程长时间等待&#xff0c;则应该使用interrupt方法来中断等待…...

C++之动态数组

C给我们提供了一个叫Vector的类&#xff0c;这个Vector在std命名空间中。这个Vector有点像一个集合&#xff0c;一个不强制其实际元素具有唯一性的集合&#xff0c;和数组一样&#xff0c;但是和C普通的数组又不太一样&#xff0c;和标准的数组不同当你创建Vector时&#xff0c…...

使用 image-combiner 开源项目实现对海报图片的生成

1&#xff1a;gitee 项目地址 image-combiner: ImageCombiner是一个专门用于Java服务端图片合成的工具&#xff0c;没有很复杂的功能&#xff0c;简单实用&#xff0c;从实际业务场景出发&#xff0c;提供简单的接口&#xff0c;几行代码即可实现图片拼合&#xff08;当然用于…...

【缓存】框架层常见问题和对策

缓存是为了加快读写速度&#xff0c;再了解redis这类框架层的缓存应用之前&#xff0c;我们不妨先思考下操作系统层面的缓存解决方案&#xff0c;这样有助于我们更深的理解缓存&#xff0c;哪些是系统层面的&#xff0c;哪些是服务层面。 以下是一些常见的缓存问题及其解决方案…...

【FAS】《CN103106397B》

原文 CN103106397B-基于亮瞳效应的人脸活体检测方法-授权-2013.01.19 华南理工大学 方法 / 点评 核心方法用的是传统的形态学和模板匹配&#xff0c;亮点是双红外发射器做差分 差分&#xff1a;所述FPGA芯片控制两组红外光源&#xff08;一近一远&#xff09;交替亮灭&…...

3D按F3为什么显示不出模型?---模大狮模型网

对于3D建模软件的用户来说&#xff0c;按下F3键通常是用来显示或隐藏模型的功能之一。然而&#xff0c;有时当按下F3键时&#xff0c;却无法正确显示模型&#xff0c;这可能会让用户感到困惑。模大狮将探讨这种情况发生的可能原因以及解决方法&#xff0c;帮助设计师们更好地理…...

C++设计模式——Adapter适配器模式

一&#xff0c;适配器模式简介 适配器模式是一种结构型设计模式&#xff0c;用于将已有接口转换为调用者所期望的另一种接口。 适配器模式让特定的API接口可以适配多种场景。例如&#xff0c;现有一个名为"Reader()"的API接口只能解析txt格式的文件&#xff0c;给这…...

Python文本处理利器:jieba库全解析

文章目录 Python文本处理利器&#xff1a;jieba库全解析第一部分&#xff1a;背景和功能介绍第二部分&#xff1a;库的概述第三部分&#xff1a;安装方法第四部分&#xff1a;常用库函数介绍1. 精确模式分词2. 全模式分词3. 搜索引擎模式分词4. 添加自定义词典5. 关键词提取 第…...

【C/C++】C语言如何实现类似C++的智能指针?

在C中&#xff0c;智能指针是为了自动化资源管理而引入的工具。比如std::unique_ptr和std::shared_ptr等&#xff0c;它们管理着所持有对象的生命周期&#xff0c;可以在智能指针被销毁时自动释放其所持有的资源。在C语言中&#xff0c;虽然没有直接的智能指针概念&#xff0c;…...

九大微服务监控工具详解

Prometheus Prometheus 是一个开源的系统监控、和报警工具包&#xff0c;Prometheus 被设计用来监控“微服务架构”。 主要解决&#xff1a; 监控和告警&#xff1a;Prometheus 可以对系统、和应用程序进行实时监控&#xff0c;并在出现问题时发送告警&#xff1b;数据收集和…...

java aliyun oss上传和下载工具类

java aliyun oss上传和下载工具类 依赖 <dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId><version>3.8.0</version></dependency>工具类 import com.alibaba.fastjson.JSON; import c…...

P7 品牌管理

逆向生成页面 新增菜单—商品系统的品牌管理 —product/brand 在代码生成器得到的文件中&#xff0c; main-resources-src-views-modules-product brand.vue、brand-add-or-update.vue放到category.vue同级vue文件有新增、删除按钮&#xff0c;但页面未显示&#xff0c;是因…...

C语言详解(动态内存管理)1

Hi~&#xff01;这里是奋斗的小羊&#xff0c;很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~~ &#x1f4a5;&#x1f4a5;个人主页&#xff1a;奋斗的小羊 &#x1f4a5;&#x1f4a5;所属专栏&#xff1a;C语言 &#x1f680;本系列文章为个人学习…...

106.网络游戏逆向分析与漏洞攻防-装备系统数据分析-在UI中显示装备与技能信息

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 如果看不懂、不知道现在做的什么&#xff0c;那就跟着做完看效果&#xff0c;代码看不懂是正常的&#xff0c;只要会抄就行&#xff0c;抄着抄着就能懂了 内容…...

AWS EMR Serverless

AWS概述 EMR Serverless 简介 在AWS概述一文中简单介绍过AWS EMR, 它是AWS提供的云端大数据平台。借助EMR可以设置集群以便在几分钟内使用大数据框架处理和分析数据。创建集群可参考官方文档&#xff1a;Amazon EMR 入门。但集群创建之后需要一直运行&#xff0c;用户需要管理…...

Java面试题:Redis持久化问题

Redis持久化问题 RDB (Redis Database Backup File) Redis数据快照 将内存中的所有数据都记录到磁盘中做快照 当Redis实例故障重启时,从磁盘读取快照文件恢复数据 使用 save/bgsave命令进行手动快照 save使用主进程执行RDB,对所有命令都进行阻塞 bgsave使用子进程执行R…...

AI赋能开发:让快马平台智能生成基于contextmenumanager的动态条件式右键菜单代码

最近在做一个电商项目时&#xff0c;遇到了一个有趣的交互需求&#xff1a;需要为不同类型的商品卡片实现智能化的右键菜单。这个需求让我发现了InsCode(快马)平台的AI辅助开发功能特别实用&#xff0c;尤其是对于contextmenumanager这种需要动态逻辑的场景。 需求分析 页面上有…...

class文件加载到内存

‌JVM将class文件加载到内存的过程主要分为三个阶段&#xff1a;加载&#xff08;Loading&#xff09;、链接&#xff08;Linking&#xff09;和初始化&#xff08;Initialization&#xff09;‌&#xff0c;其中链接又细分为验证、准备、解析三个步骤 。 一、加载&#xff08;…...

Phi-4-mini-reasoning助力Java安装与环境配置:从JDK到IDE的智能指引

Phi-4-mini-reasoning助力Java安装与环境配置&#xff1a;从JDK到IDE的智能指引 1. 为什么需要智能指引来安装Java&#xff1f; 刚接触Java开发的朋友们&#xff0c;十有八九会在环境配置这一步卡壳。我见过太多初学者在JDK版本选择、环境变量配置这些环节反复折腾&#xff0…...

**雾计算中的边缘智能:基于Python的轻量级任务调度系统设计与实现**在物联网(IoT)飞速发展的今天,传统云

雾计算中的边缘智能&#xff1a;基于Python的轻量级任务调度系统设计与实现 在物联网&#xff08;IoT&#xff09;飞速发展的今天&#xff0c;传统云计算模式已难以满足低延迟、高带宽和实时响应的需求。**雾计算&#xff08;Fog Computing&#xff09;**作为云与终端设备之间的…...

网络安全的概念与规范:从基础到实践

网络安全的概念与规范&#xff1a;从基础到实践 在数字化浪潮席卷全球的今天&#xff0c;网络安全已成为国家安全的重要组成部分。本文将系统梳理网络安全的核心概念、发展历程、主要威胁、前沿趋势以及标准规范&#xff0c;帮助读者建立完整的网络安全知识体系。 一、网络安全…...

3步实现AI智能背景移除:开源工具让透明GIF制作变得如此简单

3步实现AI智能背景移除&#xff1a;开源工具让透明GIF制作变得如此简单 【免费下载链接】backgroundremover Background Remover lets you Remove Background from images and video using AI with a simple command line interface that is free and open source. 项目地址:…...

从零构建STM32 OTA升级系统:BootLoader设计、IAP实现与APP无缝跳转实战

1. 为什么需要OTA升级系统 想象一下你开发的智能硬件产品已经卖出去几千台&#xff0c;突然发现固件有个致命bug需要修复&#xff0c;或者要增加一个用户期待已久的新功能。传统做法是让用户把设备寄回工厂&#xff0c;或者带着设备到维修点刷机——这简直是开发者的噩梦&#…...

FRCRN处理长音频文件实战:切片、批处理与结果合并

FRCRN处理长音频文件实战&#xff1a;切片、批处理与结果合并 你是不是遇到过这样的问题&#xff1f;手头有一段长达数小时的会议录音、访谈素材或者播客音频&#xff0c;背景噪音让人头疼&#xff0c;想用FRCRN这样的降噪模型处理一下&#xff0c;结果发现模型一次只能处理几…...

告别默认样式:C# WinForm自定义最大化最小化关闭按钮实战(含资源文件管理技巧)

深度定制WinForm界面&#xff1a;从按钮替换到资源管理的完整解决方案 1. 为什么需要自定义窗体控制按钮&#xff1f; 在商业软件和创意应用中&#xff0c;用户界面的视觉体验往往决定了用户对产品的第一印象。WinForm作为.NET生态中成熟的桌面应用框架&#xff0c;其默认的窗体…...

Qwerty Learner版本发布流程:从开发到上线的标准化

Qwerty Learner版本发布流程&#xff1a;从开发到上线的标准化 【免费下载链接】qwerty-learner 为键盘工作者设计的单词记忆与英语肌肉记忆锻炼软件 / Words learning and English muscle memory training software designed for keyboard workers 项目地址: https://gitcod…...