【C++入门学习指南】:函数重载提升代码清晰度与灵活性

简介: 【C++入门学习指南】:函数重载提升代码清晰度与灵活性

?前言

函数重载是C++中非常重要的概念,它允许在同一作用域中声明多个同名函数,但这些函数的参数列表必须不同。通过函数重载,可以提高代码的可读性和可维护性,简化函数调用,并提供更多的灵活性。本文将深入探讨函数重载的概念、作用以及C++支持函数重载的原理,帮助读者更好地理解和应用这一重要的编程特性。  

一、函数重载

1.1 函数重载的概念

函数重载是函数的一种特殊情况:

C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数 或 类型 或 类型顺序)不同,常用来处理实现功能类似数据类型不同的问题。

#include<iostream>
using namespace std;
// 1、参数类型不同
int Add(int left, int right)
{
  cout << "int Add(int left, int right)" << endl;
  return left + right;
}
double Add(double left, double right)
{
  cout << "double Add(double left, double right)" << endl;
  return left + right;
}
// 2、参数个数不同
void f()
{
  cout << "f()" << endl;
}
void f(int a)
{
  cout << "f(int a)" << endl;
}
// 3、参数类型顺序不同
void f(int a, char b)
{
  cout << "f(int a,char b)" << endl;
}
void f(char b, int a)
{
  cout << "f(char b, int a)" << endl;
}
int main()
{
  Add(10, 20);
  Add(10.1, 20.2);
  f();
  f(10);
  f(10, 'a');
  f('a', 10);
  return 0;
}

1.2 函数重载的作用

  1. 提高代码的可读性和可维护性:通过使用相同的函数名来表示一组相关的功能,可以使代码更加清晰和易于理解。
  2. 简化函数调用:不同的参数列表可以根据不同的情况选择合适的函数进行调用,避免了编写大量的条件判断语句。
  3. 提供更多的灵活性:通过函数重载,可以根据需要提供多种不同的函数实现,满足不同的需求。

1.3 C++支持函数重载的原理

C++支持函数重载,但是C语言不支持函数重载,这是为什么呢?  在C/C++中,一个程序要运行起来,需要经历以下几个阶段:预处理、编译、汇编、链接 。

  1. 实际项目通常是由多个头文件和多个源文件构成,当前a.cpp中调用了b.cpp中定义的Add函数时,编译后链接前,a.o的目标文件中没有Add的函数地址,因为Add是在b.cpp中定义的,所以Add的地址在b.o中。那么怎么办呢?  
  2. 链接阶段就是专门处理这种问题,链接器看到a.o调用Add,但是没有Add的地址,就会到b.o的符号表中找Add的地址,然后链接到一起。  
  3. 链接时,面对Add函数,链接接器会使用哪个名字去找呢?这里每个编译器都有自己的函数名修饰规则。  

Windows下vs修饰规则过于复杂,Linux下g++修饰规则简单易懂,下面使用g++演示这个修饰后的名字。

C语言编译后:函数名字的修饰没有发生改变。

C++编译后:函数名字的修饰发生改变,编译器将函数参数类型信息添加到修改后的名字中。

以上我们可以看出gcc的函数修饰后名字不变。而g++的函数修饰后变成【_Z+函数长度+函数名+类型首字母】。

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

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

1.4 扩展

windows下vs编译器对函数名字修饰规则相对复杂难懂,但道理都是类似的,这里就不做细致的研究了。

关于对C/C++函数调用约定和名字修饰规则,C/C++的调用约定 里面有对vs下函数名修饰规则讲解。

有兴趣好奇的小伙伴可以看看哦~

?? 全篇总结

函数重载是C++编程中的重要概念,掌握了函数重载,可以使代码更加清晰易懂,提高代码的灵活性和可维护性


e9e50e9c01f1e14aa568181d2066e69c.png

目录
相关文章
|
1天前
|
C++ 编译器 程序员
C++ 从零基础到入门(3)—— 函数基础知识
C++ 从零基础到入门(3)—— 函数基础知识
|
1天前
|
C++ 存储
C++从零基础到入门(2)—— (if、switch、for、while语句)
C++从零基础到入门(2)—— (if、switch、for、while语句)
C++从零基础到入门(2)—— (if、switch、for、while语句)
|
1天前
|
编译器 C语言 C++
C++入门基础-2
C++入门基础
12 3
|
1天前
|
C语言 C++
C++入门基础-1
C++入门基础
18 1
|
1天前
|
编译器 C++
【C++】继续学习 string类 吧
首先不得不说的是由于历史原因,string的接口多达130多个,简直冗杂… 所以学习过程中,我们只需要选取常用的,好用的来进行使用即可(有种垃圾堆里翻美食的感觉)
7 1
|
1天前
|
算法 安全 程序员
【C++】STL学习之旅——初识STL,认识string类
现在我正式开始学习STL,这让我期待好久了,一想到不用手撕链表,手搓堆栈,心里非常爽
16 0
|
1天前
|
存储 安全 测试技术
【C++】string学习 — 手搓string类项目
C++ 的 string 类是 C++ 标准库中提供的一个用于处理字符串的类。它在 C++ 的历史中扮演了重要的角色,为字符串处理提供了更加方便、高效的方法。
16 0
【C++】string学习 — 手搓string类项目
|
1天前
|
自然语言处理 编译器 C语言
【C++】C++ 入门 — 命名空间,输入输出,函数新特性
本文章是我对C++学习的开始,很荣幸与大家一同进步。 首先我先介绍一下C++,C++是上个世纪为了解决软件危机所创立 的一项面向对象的编程语言(OOP思想)。
34 1
【C++】C++ 入门 — 命名空间,输入输出,函数新特性
|
1天前
|
设计模式 安全 算法
【C++入门到精通】特殊类的设计 | 单例模式 [ C++入门 ]
【C++入门到精通】特殊类的设计 | 单例模式 [ C++入门 ]
17 0
http://www.vxiaotou.com