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

c++的函数重载

1.在C++ 中,函数重载是指在同一个作用域内,可以定义多个同名的函数,但这些函数的参数列表(参数的类型、个数或顺序)必须不同。编译器会根据函数调用时提供的实际参数来确定具体调用哪个重载函数。例如:
 
#include <iostream>

// 计算两个整数的和
int add(int num1, int num2)

{
    return num1 + num2;
}

// 计算两个浮点数的和
float add(float num1, float num2)

{
    return num1 + num2;
}

// 计算三个整数的和
int add(int num1, int num2, int num3)

{
    return num1 + num2 + num3;
}

int main()

{
    std::cout << add(5, 3) << std::endl; // 调用两个整数参数的add函数
    std::cout << add(2.5f, 3.5f) << std::endl; // 调用两个浮点数参数的add函数
    std::cout << add(1, 2, 3) << std::endl; // 调用三个整数参数的add函数
    return 0;
}
 
 
在上述代码中,定义了三个名为  add  的函数,它们的参数类型和个数不同,通过函数重载,实现了根据不同的参数来执行不同的加法操作。
 
需要注意的是,函数重载与函数的返回值类型无关,仅根据参数列表来区分不同的重载函数。如果两个函数仅有返回值类型不同,而参数列表相同,则不能构成函数重载,这会导致编译错误。

2.函数重载的底层原理

 

函数重载的底层原理主要依赖于编译器的编译机制。在编译阶段,编译器会根据函数的参数类型、个数和顺序来为每个重载函数生成一个唯一的内部标识(根据函数名修饰规则)。当程序中出现函数调用时,编译器会根据传入的实际参数来匹配对应的重载函数,并生成正确的调用代码。这个过程是在编译时完成的,属于静态绑定,即编译器在编译期间就确定了要调用的具体函数。

 

函数名修饰规则

 

函数名修饰是编译器用来区分不同函数的一种方式,不同的编译器有不同的函数名修饰规则,但通常都会包含函数名、参数类型和其他相关信息。以常见的C++ 编译器为例,通常会将函数的参数类型编码到函数名中。例如,对于函数  int add(int a, int b)  和  float add(float a, float b) ,编译器可能会将它们修饰为类似  _Z3addii  和  _Z3addff  的形式,其中  _Z  是常见的前缀, 3  表示函数名  add  的长度,后面的  ii  和  ff  分别表示参数类型为  int  和  float 。对于类的成员函数,还会包含类名等信息,以区分不同类中的同名函数。

 

函数名修饰后的结果在目标文件中是唯一的,这样链接器在链接阶段就能够根据函数名修饰来准确地找到函数的定义,实现函数的正确链接和调用。

 

 

喜欢我就点点关注吧

相关文章:

  • 网站模版超市网站应该如何推广
  • 加盟做网站百度地图导航网页版
  • html 手机网站开发信阳网站推广公司
  • 有什么做树状图的网站推广服务公司
  • 广告开户百度热搜关键词排名优化
  • 开发公司 网站建设价格行业网站有哪些平台
  • 机器学习 | 强化学习方法分类汇总 | 概念向
  • 国产信创数据库:PolarDB 分布式版 V2.0,支持集中分布式一体化
  • Vanna + qwq32b 实现 text2SQL
  • springboot集成springcloud vault读值示例
  • C++ - 数据容器之 unordered_map(声明与初始化、插入元素、访问元素、遍历元素、删除元素、查找元素)
  • 三相电为什么没零线也能通电
  • kali linux vmware 光标无法移出vmware,需要按ctrl + alt 才能移出光标
  • 【DB2】事务日志满/归档占用较大问题处理记录
  • 深入解析栈式虚拟机与反向波兰表示法
  • FacialExpressionDetection的conda虚拟环境搭建Window
  • 清华DeepSeek教程又双叒叕更新了!(共7份PDF下载)
  • DAPP实战篇:使用web3.js实现前端输入钱包地址查询该地址的USDT余额——前端篇
  • 算法竞赛中常用的数据处理库函数
  • 2025常用的ETL 产品推荐:助力企业激活数据价值
  • PyTorch Tensor维度变换实战:view/squeeze/expand/repeat全解析
  • SPI、UART、IIC(I²C) 通信协议的详细介绍及对比分析
  • NO.86十六届蓝桥杯备战|动态规划-01背包|采药|小A点菜|Cow Frisbee Team(C++)
  • KWDB创作者计划—KWDB:重新定义数据管理的边界
  • (51单片机)串口通讯(串口通讯教程)(串口接收发送教程)
  • 支付系统C扫B全链路压测方案