C++修炼之练气期三层——函数重载

简介: C++修炼之练气期三层——函数重载

0000000000000.png

目录


1.引例

2.函数重载的概念

3.C++支持函数重载的原理


正文


1.引例


倘若现在要实现一个加法计算器,用C语言实现的话我们会选择这样的方式:

int Add_int(int a, int b)
{
  return a + b;
}
double Add_double(double a, double b)
{
  return a + b;
}

在使用加法计算器时,需要根据需求调用不同的函数:

int main()
{
  cout << Add_int(10, 20) << endl;
  cout << Add_double(2.2, 3.3) << endl;
  return 0;
}

这里存在一个让人不舒服的点,明明都是简单的加法操作,却因为参数不同的原因在调用函数时需要指定函数名。凭什么它们两个函数不能都叫作Add呢?

针对这个问题,C++中提出了函数重载的概念。函数定义时可以重名,调用函数时,编译器会根据所传参数的类型自动匹配相应的函数

例如,有了函数重载后,加法计算器就可以这样设计:

int Add(int a, int b)
{
  return a + b;
}
double Add(double a, double b)
{
  return a + b;
}
int main()
{
  //调用函数
  cout << Add_int(10, 20) << endl;
  cout << Add_double(2.2, 3.3) << endl;
  return 0;
}


2.函数重载的概念


函数重载:是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数类型类型顺序)不同,常用来处理实现功能类似数据类型不同的问题。例如:

#include<iostream>
using namespace std;
//1.参数类型不同
int Add(int a, int b)
{
  return a + b;
}
double Add(double a, double b)
{
  return a + b;
}
//2.参数个数不同
int Add(int a, int b)
{
  return a + b;
}
int Add(int a, int b, int c)
{
  return a + b + c;
}
//3.参数类型的顺序不同
void F(int a, char b)
{
  //...
}
void F(char a, int b)
{
  //...
}
int main()
{
  Add(10, 20);
  Add(10, 20, 30);
  Add(2.2, 3.3);
  F(10, 'a');
  F('a', 10);
  return 0;
}


3.C++支持函数重载的原理


我们用函数重载定义函数Add,在我们眼中,两个函数名字相同,参数不同,调用函数时,我们知道应该调用哪个,那么编译器在链接阶段,如何知道去哪寻找对应的函数栈帧呢?

int Add(int a, int b)
{
  return a + b;
}
double Add(double a, double b)
{
  return a + b;
}
int main()
{
  Add(10, 20);
  Add(2.2, 3.3);
  return 0;
}



其实编译器在编译与汇编阶段,会对函数名做修饰。不同的编译器对函数名的修饰也不同,为了方便观察,这里以Linux环境下的g++编译器为例。输入指令查看可执行程序反汇编的代码:

g++ Test.cpp -o Testcpp
objdump -S Testcpp

以下是Linux下g++修饰的汇编代码:

9.png为了作对比,我们再看看没有函数重载的C语言是否会对函数名做修饰:

gcc Test.c -o Testc
objdump -S Testc

C代码:

#include<stdio.h>
int Add_int(int a, int b)
{
  return a + b;
}
double Add_double(double a, double b)
{
  return a + b;
}
int main()
{
  Add_int(10, 20);
  Add_double(2.2, 3.3);
  return 0;
}

汇编代码:5.png

通过这里就理解了C语言没办法支持重载,因为同名函数没办法区分。而C++是通过函数修饰规则来区分,只要参数不同,修饰出来的名字就不一样,就支持了重载。

最后补充,如果两个函数函数名和参数是一样的,返回值不同是不构成重载的,因为调用时编译器没办法区分。

目录
相关文章
|
12天前
|
程序员 C++
C++中的函数重载有什么作用
【10月更文挑战第19天】C++中的函数重载有什么作用
13 3
|
5月前
|
编译器 C++
C++进阶之路:何为命名空间、缺省参数与函数重载
C++进阶之路:何为命名空间、缺省参数与函数重载
37 3
|
12天前
|
编译器 程序员 C++
C++中的函数重载是什么
【10月更文挑战第19天】C++中的函数重载是什么
10 0
|
1月前
|
自然语言处理 编译器 Linux
【C++】巧用缺省参数与函数重载:提升编程效率的秘密武器
【C++】巧用缺省参数与函数重载:提升编程效率的秘密武器
|
1月前
|
程序员 C++ 开发者
C++入门教程:掌握函数重载、引用与内联函数的概念
通过上述介绍和实例,我们可以看到,函数重载提供了多态性;引用提高了函数调用的效率和便捷性;内联函数则在保证代码清晰的同时,提高了程序的运行效率。掌握这些概念,对于初学者来说是非常重要的,它们是提升C++编程技能的基石。
21 0
|
3月前
|
编译器 程序员 C语言
C++函数重载
在实际开发中,有时候我们需要实现几个功能类似的函数,只是有些细节不同。例如希望交换两个变量的值,这两个变量有多种类型,可以是 int、float、char、bool 等,我们需要通过参数把变量的地址传入函数内部。在C语言中,程序员往往需要分别设计出三个不同名的函数,其函数原型与下面类似: void swap1(int *a, int *b); //交换 int 变量的值 void swap2(float *a, float *b); //交换 float 变量的值 void swap3(char *a, char *b); //交换 char 变量的
C++函数重载
|
3月前
|
编译器 Linux C语言
【C++小知识】为什么C语言不支持函数重载,而C++支持
【C++小知识】为什么C语言不支持函数重载,而C++支持
|
3月前
|
安全 编译器 C++
C++入门 | 函数重载、引用、内联函数
C++入门 | 函数重载、引用、内联函数
31 5
|
4月前
|
存储 自然语言处理 编译器
【C++入门 三】学习C++缺省参数 | 函数重载 | 引用
【C++入门 三】学习C++缺省参数 | 函数重载 | 引用
|
4月前
|
算法 编译器 C++
C++基础知识(三:哑元和内联函数和函数重载)
在C++编程中,"哑元"这个术语虽然不常用,但可以理解为在函数定义或调用中使用的没有实际功能、仅作为占位符的参数。这种做法多见于模板编程或者为了匹配函数签名等场景。例如,在实现某些通用算法时,可能需要一个特定数量的参数来满足编译器要求,即使在特定情况下某些参数并不参与计算,这些参数就可以被视为哑元。