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

【C++】第四章—— 函数重载 Function Overloading 笔记

📌 一、什么是函数重载

函数重载:同一个作用域内可以定义多个 函数名相同、但参数列表不同的函数。

编译器会根据调用时传入的参数个数、类型、顺序进行区分,自动匹配最合适的函数。


✅ 作用:

  • 提高代码可读性;
  • 让多个相似功能的函数统一名称,接口更简洁;
  • 是 C++ 支持“多态”的基础之一(静态多态)。

📚 二、函数重载的条件

✅ 必须不同的有:

  • 参数个数不同
  • 参数类型不同
  • 参数顺序不同(类型顺序)
void print(int a);
void print(double a);           // 类型不同
void print(int a, int b);       // 参数个数不同
void print(double a, int b);    // 类型顺序不同

❌ 不构成重载的情况:

  1. 仅返回值不同
int sum(int a);     // 合法
double sum(int a);  // ❌ 不合法:返回值不同但参数完全相同
  1. 仅参数名不同
int sum(int x);     // 合法
int sum(int y);     // ❌ 不合法:只是名字不同

🔧 三、函数重载示例

#include <iostream>
using namespace std;void print(int a) {cout << "整型: " << a << endl;
}void print(double a) {cout << "浮点型: " << a << endl;
}void print(string a) {cout << "字符串: " << a << endl;
}int main() {print(10);          // 输出:整型: 10print(3.14);        // 输出:浮点型: 3.14print("Hello");     // 输出:字符串: Helloreturn 0;
}

🚫 四、与默认参数的冲突

函数重载与默认参数可能导致二义性。

void func(int a);
void func(int a, int b = 10);func(5);  // ❌ 二义性:编译器不知调用哪一个

✅ 建议避免重载函数中出现过多默认参数,或设计时注意不冲突。


🧠 五、函数重载 + const 的区分

void show(int a);
void show(const int a);  // ❌ 与上函数视为相同,重定义

✅ 但对于 指针/引用 参数,const 可形成重载:

void display(int& x);       // 非 const 引用
void display(const int& x); // const 引用,合法重载

🔁 六、函数重载与 inline / static 的关系

  • inlinestatic 不影响重载判断;
  • 判断重载仅看:参数列表是否不同

🧱 七、重载构造函数(构造函数重载)

构造函数也可以重载,根据参数不同创建不同初始化方式。

class Box {
public:Box() { cout << "默认构造" << endl; }Box(int l) { cout << "单参数构造: " << l << endl; }Box(int l, int w) { cout << "双参数构造: " << l << ", " << w << endl; }
};int main() {Box b1;          // 默认构造Box b2(10);      // 单参Box b3(10, 20);  // 双参return 0;
}

⚠️ 八、函数模板与重载的优先级

当普通函数与函数模板都能匹配时,优先调用普通函数

void show(int a) {cout << "普通函数" << endl;
}template<typename T>
void show(T a) {cout << "模板函数" << endl;
}int main() {show(5);  // 调用普通函数show(3.14); // 调用模板函数
}

📝 九、小结

项目是否影响重载
参数个数不同✅ 是
参数类型不同✅ 是
参数顺序不同✅ 是
返回值不同❌ 否
参数名不同❌ 否
默认参数冲突⚠️ 可能引起二义性
const 修饰(非引用)❌ 无效
const 修饰(引用/指针)✅ 有效

🎯 建议与实践

  • 使用函数重载可以统一接口,增强代码可读性;
  • 避免默认参数引起的二义性;
  • 对于模板编程,配合重载使用更灵活;
  • 若设计多个功能类似函数,考虑重载而非新命名。

http://www.dtcms.com/a/271712.html

相关文章:

  • 2、Unity插件整合
  • 智慧物流管理:动作识别与包装检测的协同突破
  • 射频信号(大宽高比)时频图目标检测anchors配置
  • SpringBoot实现MCP
  • 【Linux网络编程】Socket - TCP
  • 【通识】NodeJS基础
  • LLaMA 学习笔记
  • Java 多态详解:从原理到实战,深入理解面向对象编程的核心特性
  • C#基础篇(09)结构体(struct)与类(class)的详细区别
  • Vue响应式原理三:响应式依赖收集-类
  • 大模型的下半场:从工具到智能体的产业变革与2025突围之路
  • AI大模型:(二)4.2 文生图训练实践-真人写实生成
  • 8.2 文档预处理模块(二)
  • 学习笔记(31):matplotlib绘制简单图表-直方图
  • UNet改进(19):基于残差注意力模块Residual Attention的高效分割网络设计
  • 编译安装的Mysql5.7报“Couldn‘t find MySQL server (mysqld_safe)“的原因 笔记250709
  • 主流大模型Agent框架 AutoGPT详解
  • 软件互联网产品发版检查清单
  • WIndows 编程辅助技能:格式工厂的使用
  • Dify教程更改文件上传数量限制和大小限制
  • JVM 调优
  • 双指针-15.三数之和-力扣(LeetCode)
  • AI技术如何重塑你的工作与行业?——实战案例解析与效率提升路径
  • gdb调试工具
  • Lingo软件学习(一)好学爱学
  • DPDK graph图节点处理框架:模块化数据流计算的设计与实现
  • dify配置邮箱,密码重置以及邮箱邀请加入
  • 【Java】【字节面试】字符串中 出现次数最多的字符和 对应次数
  • HTML应用指南:利用GET请求获取全国山姆门店位置信息
  • 跨服务sqlplus连接oracle数据库