C++学习笔记(十六)——函数重载

embedded/2025/3/14 18:21:39/

一、 函数重载

作用:
函数重载(Function Overloading) 是 C++ 允许 多个同名函数 但参数不同 的一种特性。

  • 通过参数的类型、个数或顺序区分不同的函数。
  • 编译器会根据调用时提供的参数自动选择合适的函数

特点

  • 函数名相同,但参数列表不同参数类型、个数、顺序至少有一个不同)。
  • 返回值类型不能作为区分重载的标准
  • 提高代码可读性,简化接口设计。

二、 函数重载的基本语法

语法:

返回类型 函数名(参数1, 参数2, ...);
返回类型 函数名(不同参数1, 不同参数2, ...);

示例:

#include <iostream>
using namespace std;// 计算整数的平方
int square(int x) 
{return x * x;
}// 计算双精度浮点数的平方
double square(double x) 
{return x * x;
}int main() {cout << "square(5) = " << square(5) << endl;      // 调用 int 版本cout << "square(2.5) = " << square(2.5) << endl;  // 调用 double 版本system("pause");return 0;
}

注意

  • square(int x)square(double x) 函数名相同,参数类型不同,属于重载函数
  • 编译器自动匹配合适的重载版本

三、函数重载的规则

(1)允许的重载情况

  • 参数类型不同
    void func(int x);
    void func(double x);
    
  • 参数个数不同
    void func(int x);
    void func(int x, int y);
    
  • 参数顺序不同
    void func(int x, double y);
    void func(double x, int y);
    

(2)不允许的重载情况

  • 仅返回值不同,参数列表相同

    int func(int x);   
    double func(int x);   //  错误,无法区分按返回值类型区分的函数
    
  • 仅参数名称不同(参数类型相同)

    void func(int a);
    void func(int b); //  错误,参数类型相同,函数重复定义
    

四、 应用案例

(1) 函数重载——自动调用匹配的重载版本

示例——计算不同数据类型的绝对值:

#include <iostream>
using namespace std;// 绝对值计算(int 版本)
int absVal(int x) 
{return (x < 0) ? -x : x;
}// 绝对值计算(double 版本)
double absVal(double x) 
{return (x < 0) ? -x : x;
}int main() {cout << "absVal(-10) = " << absVal(-10) << endl;cout << "absVal(-5.5) = " << absVal(-5.5) << endl;system("pause");return 0;
}

注意:
根据参数类型,编译器自动调用匹配的重载版本

(2) 函数重载 + 默认参数

示例——计算面积:

#include <iostream>
using namespace std;// 计算矩形面积(默认参数)
int area(int length, int width = 10) 
{return length * width;
}// 计算圆面积
double area(double radius) 
{return 3.14159 * radius * radius;
}int main() {cout << "矩形面积: " << area(5) << endl;       // 使用默认参数cout << "矩形面积: " << area(5, 6) << endl;    // 传入两个参数cout << "圆的面积: " << area(3.0) << endl;     // 调用 double 版本system("pause");return 0;
}

注意:

  • area(int, int) 有默认参数调用时如果省略参数,则使用默认值
  • area(double) 计算圆的面积,自动匹配合适的重载版本

(3) 函数重载 + 类型转换

可能出现的问题:
如果一个重载函数隐式类型转换冲突,可能导致歧义(Ambiguous)

示例:

#include <iostream>
using namespace std;// int 版本
void func(int x) 
{ cout << "int 版本" << endl; 
}// char 版本
void func(char x) 
{ cout << "char 版本" << endl; 
}int main() {func(10);   // 调用 int 版本func('A');  // 调用 char 版本// func(2.5);  // 错误, 可能调用 int 或 char,导致歧义system("pause");return 0;
}

注意:

  • 使用 explicit 类型转换
    func(static_cast<int>(2.5));  // 强制使用 int 版本
    
  • 避免过多的自动类型转换

(4) const 引用重载

示例——const引用重载:

#include <iostream>
using namespace std;void print(int& x) 
{ cout << "普通引用" << endl; 
}void print(const int& x) 
{ cout << "const 引用" << endl; 
}int main() {int a = 10;const int b = 20;print(a);  // 调用非 const 版本print(b);  // 调用 const 版本print(30); // 传递临时变量,调用 const 版本system("pause");return 0;
}

注意:

  • print(int &x) 只能绑定const 变量。
  • print(const int &x) 可以绑定 const 变量或临时值。

http://www.ppmy.cn/embedded/172546.html

相关文章

贪心算法简介(greed)

前言&#xff1a; 贪心算法&#xff08;Greedy Algorithm&#xff09;是一种在每个决策阶段都选择当前最优解的算法策略&#xff0c;通过局部最优的累积来寻求全局最优解。其本质是"短视"策略&#xff0c;不回溯已做选择。 什么是贪心、如何来理解贪心(个人对贪心的…

C# 发送邮件 报错:此请求已被阻止,因为当用在 GET 请求中时,会将敏感信息透漏给第三方网站。

C# 发送邮件 报错&#xff1a;此请求已被阻止&#xff0c;因为当用在 GET 请求中时&#xff0c;会将敏感信息透漏给第三方网站。 报错信息分析 当你遇到如下报错时&#xff1a; 此请求已被阻止&#xff0c;因为当用在 GET 请求中时&#xff0c;会将敏感信息透漏给第三方网站。…

【MySQL】用户管理和权限

欢迎拜访&#xff1a;雾里看山-CSDN博客 本篇主题&#xff1a;【MySQL】用户管理和权限 发布时间&#xff1a;2025.3.12 隶属专栏&#xff1a;MySQL 目录 引言用户用户信息创建用户语法案例 修改用户密码语法案例 删除用户语法案例 权限权限列表查看和刷新用户的权限给用户授权…

52.HarmonyOS NEXT 登录模块开发教程(六):UI设计与用户体验优化

温馨提示&#xff1a;本篇博客的详细代码已发布到 git : https://gitcode.com/nutpi/HarmonyosNext 可以下载运行哦&#xff01; HarmonyOS NEXT 登录模块开发教程&#xff08;六&#xff09;&#xff1a;UI 设计与用户体验优化 文章目录 HarmonyOS NEXT 登录模块开发教程&…

STM32全系大阅兵(2)

接前一篇文章:STM32全系大阅兵(1) 本文内容参考: STM32家族系列的区别_stm32各个系列区别-CSDN博客 STM32--STM32 微控制器详解-CSDN博客

JVM之基础知识

简介 JVM&#xff1a;Java Virtual Machine&#xff0c;Java虚拟机&#xff0c;用于运行java程序。 JVM的运行机制&#xff1a;在运行Java程序时&#xff0c;首先会启动jvm&#xff0c;然后由它来负责解释执行Java程序&#xff0c;并且Java程序只能运行于jvm之上&#xff0c;…

神经网络完成训练的详细过程

神经网络完成训练的详细过程 一、神经网络的基本概念 神经网络是一种模拟人脑神经系统的计算模型&#xff0c;由大量的神经元&#xff08;节点&#xff09;和它们之间的连接&#xff08;权重&#xff09;组成。神经元接收输入信号&#xff0c;通过加权求和和激活函数的处理&a…

【图片批量转换合并PDF】多个文件夹的图片以文件夹为单位批量合并成一个PDF,基于wpf的实现方案

项目背景: 多个图片分布在不同文件夹,如何以文件夹为单位批量合并成一个PDF,还要保证文件夹里面图片大小和顺序 实现功能: 1、单张图片的转换PDF:一张图临时转一下 2、多张图片转换成PDF:多张图单独转成PDF 3、多级目录多张图转换成PDF:多级目录多张图单独转成多个PDF…