[C++]函数重载(什么是函数重载,函数重载的原理(底层怎么实现))

news2024/11/14 14:15:13

一、什么是函数重载

函数重载是指在同一作用域内,可以有多个功能类似具有相同函数名,不同参数列表(包括参数类型、参数个数、参数顺序)的函数。编译器会根据函数调用时提供的参数来决定调用哪一个具体的函数。

注意:只有返回值类型不同并不构成函数重载!原因:编译器对函数名字修饰时(下面会讲)修饰后的函数名不会包含函数的返回值类型。

使用例子:

#include <iostream>
#include <string>
using namespace std;
string add(const string& s1, const string& s2)
{
	return s1 + s2;
}

int add(const int& x1, const int& x2)
{
	return x1 + x2;
}

int main()
{
	string s1 = "x1", s2 = " + x2 = ";
	int x1 = 1, x2 = 2;
	cout << add(s1, s2) << add(x1, x2) << endl;
	return 0;
}

结果:

二、函数重载的原理(底层怎么实现)

1.一个可执行文件的形成过程

  • 预处理:进行头文件展开、去注释、宏替换、条件编译等
  • 编译:检查语法,生成汇编代码
  • 汇编:将汇编代码生成二进制机器码
  • 链接:合并连接,生成可执行程序

2.调用重载函数的原理

在编译期间,编译器会对函数实参进行推演,根据推演的结果找到对应的重载函数,如果存在且不造成二义性则调用,否则产生编译错误。

3.函数命名修饰规则 

.函数命名修饰规则:编译器在编译时对函数名的改写方式。

  • C:简单,只在函数名前面加下划线(_)
  • C++:复杂,编译器会将函数的参数类型增加到函数名中,这样就可以保证重载函数在底层中函数名的不同。
  • 这也就是C++支持函数重载而C不支持函数重载的根本原因。

4.extern "C"

 C++函数前如果用extern "C"修饰,这表明告诉编译器将使用C的规则对此函数进行编译,那么对函数命名修饰时就会使用C的函数命名规则。

例子:

//在C++的环境下,编译器对函数名修饰时就会使用C的命名修饰规则
extern "C" add(int x, int y)
{
    return x + y;
}

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

洛谷_P1102 A-B 数对_python写法

P1102 A-B 数对 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 解法一&#xff1a; n, c map(int,input().split())data list(map(int,input().split())) data.sort() maxx max(data)sum 0 l [0 for _ in range(maxx1)] for i in data:l[i] 1 for b in range(1, maxx1)…

漏洞扫描-让安全弱点无所遁形

随着信息技术的迅猛发展和互联网的广泛普及&#xff0c;网络安全问题日益凸显。在这个数字化的世界里&#xff0c;无论是企业还是个人&#xff0c;都面临着前所未有的安全威胁。安全漏洞&#xff0c;作为这些威胁的源头&#xff0c;常常被忽视或无法及时发现。 而漏洞扫描&…

VBA技术资料MF133:隐藏编辑栏及计算字符串

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。“VBA语言専攻”提供的教程一共九套&#xff0c;分为初级、中级、高级三大部分&#xff0c;教程是对VBA的系统讲解&#…

20240319-1-过拟合与欠拟合

过拟合欠拟合面试题 1. 如何理解高方差与低偏差? 模型的预测误差可以分解为三个部分: 偏差(bias)&#xff0c; 方差(variance) 和噪声(noise). 偏差 偏差度量了模型的期望预测与真实结果的偏离程度&#xff0c; 即刻画了学习算法本身的拟合能力。偏差则表现为在特定分布上…

二叉树|236.二叉树的最近公共祖先

力扣题目链接 class Solution { public:TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {if (root q || root p || root NULL) return root;TreeNode* left lowestCommonAncestor(root->left, p, q);TreeNode* right lowestCommonAncesto…

智慧工地源码 数字孪生可视化大屏 工地管理平台系统源码 多端展示(PC端、手机端、平板端)

智慧工地源码 数字孪生可视化大屏 工地管理平台系统源码 多端展示&#xff08;PC端、手机端、平板端&#xff09; 智慧工地系统多端展示&#xff08;PC端、手机端、平板端&#xff09;;数字孪生可视化大屏&#xff0c;一张图掌握项目整体情况;使用轻量化模型&#xff0c;部署三…

IPhone让用户升级?网友你咋不降点!

最近一个热搜刷屏了我的朋友圈&#xff0c;我点开一看是苹果上架了全新“换代有来”页面&#xff0c;其主要表达了苹果用户可以将旧的iphone升级到全新的iphoe15上。并告诉贴心的给网友对比了一下换代的好处。 并且还详细了说了一些iPhone 11、11 Pro、11 Pro Max、12、12 mini…

flutter使用Command库调用cmd命令或者shell命令,并支持多个参数和指定文件夹目录

想要在不同的平台上运行flutter doctor命令&#xff0c;就需要知道对应的平台是windows还是linux&#xff0c;如果是windows就需要调用cmd命令&#xff0c;如果是linux平台&#xff0c;就需要调用sh命令&#xff0c;所以可以通过cfg!实现不同平台的判断&#xff0c;然后调用不同…

【C++重新认知】:泛型编程(模板编程)

一、什么是泛型编程 当我们设计函数或者类时&#xff0c;有时候需要对应不同数据类型编写相同的代码&#xff0c;这样的话不仅有代码冗余&#xff0c;而且更加的加大程序员开发事件&#xff0c;降低开发效率&#xff0c;因此泛型编程就是解决此类情况----不同的数据类型可以重…

【大模型基础】什么是KV Cache?

哪里存在KV Cache&#xff1f; KV cache发生在多个token生成的步骤中&#xff0c;并且只发生在decoder中&#xff08;例如&#xff0c;decoder-only模型&#xff0c;如 GPT&#xff0c;或在encoder-decoder模型&#xff0c;如T5的decoder部分&#xff09;&#xff0c;BERT这样…

华院计算荣获CSDN“创新企业”和“年度创新产品与解决方案”大奖

日前&#xff0c;全国最大的专业开发者社区CSDN发布“2023中国开发者影响力年度榜单”&#xff0c;华院计算凭借其卓越的认知智能引擎平台荣获“创新企业”和“年度创新产品与解决方案”两项大奖。 CSDN 以数据为基础&#xff0c;经过个人或企业提交资料、层层筛选、深入调研、…

【C++教程从0到1入门编程】第十三篇:STL中list类的模拟实现

一、list的模拟实现 #include<iostream> #include<assert.h> #pragma once namespace jyr {template<class T>struct _list_node{_list_node<T>* _next;_list_node<T>* _prev;T _data;_list_node(const T& val T()):_next(nullptr), _prev(…

西圣VS飞利浦VS倍思开放式耳机哪款值得入手?爆款产品无广大测评

在当今这个无线耳机盛行的时代&#xff0c;开放式耳机以其独特的佩戴舒适度和出色的音质体验&#xff0c;逐渐赢得了消费者的青睐&#xff0c;西圣、飞利浦、倍思作为市场上的知名品牌&#xff0c;都推出了各具特色的开放式耳机产品&#xff0c;许多消费者也因此不知道哪款更加…

Mybatis中条件传入多个参数时,如何处理

entity&#xff1a; Data AllArgsConstructor NoArgsConstructor public class User {private Integer id;private String username;private String password;private String phone;private String address; }dao接口&#xff1a; public interface UserDAO {List<User>…

AWS EC2设置root登录

在使用亚马逊的服务器时&#xff0c;官方默认是使用密钥登录&#xff0c;跟国内的云服务器差别较大&#xff0c;本文记录下&#xff0c;如何开放AWS EC2的root登录。 一、通过网页版或者XShell登录服务器 这里略过 二、设置root账户密码 # 切换 root sudo -i # 设置或修改密…

常见端口及对应服务

6379 redis未授权 7001、7002 weblogic默认弱口令、反序列化 9200、9300 elasticsearch 参考乌云&#xff1a;多玩某服务器ElasticSearch命令执行漏洞 11211 memcache未授权访问 50000 SAP命令执行 50070、50030 hadoop默认端口未授权访问

1.Git快速入门

文章目录 Git快速入门1.Git概述2.SCM概述3.Git安装3.1 软件下载3.2 软件安装3.3 软件测试 Git快速入门 1.Git概述 Git是一个免费的&#xff0c;开源的分布式版本控制系统&#xff0c;可以快速高效地处理从小型到大型的各种项目&#xff0c;Git易于学习&#xff0c;占用空间小&…

A Novel Negative Sample Generating Method for KnowledgeGraph Embedding

摘要 为了有效地提取知识图中的关系和原因&#xff0c;将实体和关系编码到一个连续的低维语义空间中。在负样本生成阶段&#xff0c;大多数知识图嵌入方法更注重替换头或尾实体以提高训练效率&#xff0c;很少替换关系。这些负样本生成方法对关系预测的贡献不大。本文提出了一…

dubbo再回首

dubbo 服务框架&#xff0c; 远程通讯&#xff0c;集群容错&#xff0c;自动发现 spi&#xff1a; 接口全限定名找到指定目录下对应的文件&#xff0c;获取具体的实现类然后加载 增加缓存存储实例&#xff0c;对ioc api对支持 流程&#xff1a; 之前的博客实战总结&#xff1…

Linux之文件管理与重定向

文件的管理 最开始说到过, 一个进程是可以打开多个文件的并且可以对这些文件做出不同的操作, 也就是说加载到内存中的文件可能存在多个. 操作系统要不要管理这些打开的文件呢? 当我们在程序里面打开多个文件时, 操作系统肯定是得对这些文件进行管理的, 而管理的本质就是对数…