【C++】C++入门 函数重载

简介: 【C++】C++入门 函数重载

一、函数重载定义

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

例如:

#include<iostream>
using namespace std;
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;
}
int main()
{
  int a = Add(1, 2);
  double b = Add(1.1, 2.2);
  cout << a << endl;
  cout << b << endl;
  return 0;
}

我们可以看到定义了一个Add函数来求两个不同类型数的和,在调用过程中系统会自动根据其实参的类型不同来实现准确调用。

在C++中不仅函数可以重载,运算符也可以重载。例如:

运算符<<,>>。既可以做移位运算符,也可以做输出,输入运算符。

二、函数重载的条件

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;
}

注意:函数重载的返回类型可以相同也可以不相同,仅仅返回类型不同不足以成为函数的重载。因为调用函数不一定就需要去接收返回值

三、函数重载的原理–名字修饰(name Mangling)

为什么C++支持函数重载,而C语言不支持函数重载呢?

在C/C++中,一个程序要运行起来,需要经历以下几个阶段:预处理、编译、汇编、链接。

在编译阶段,编译器会对函数名进行修饰

  • C语言中

    由于C语言只会给函数进行简单的重命名,具体的方法是给函数名之前加上”_”;所以加入两个函数名相同的函数在编译之后的函数名也照样相同,调用时会因为不知道到底调用那个而出错,所以C语言中不支持函数重载。
  • C++中
    在编译阶段,虽然两个函数的函数名一样,但是编译器会根据形成函数重载的条件对它们的函数名进行修饰,让他们在符号表中生成的名称不一样。
    由于在.cpp文件中,两个函数生成的符号表中的名称不一样,所以是可以编译通过的。

C++在不同的平台下修饰规则不太一样,Windows下vs的修饰规则有些复杂,而Linux下g++的修饰规则简单易懂

  • 在windows 下

    ?Add@@YAHHH@Z
    ?代表开始
    Add代表原本的函数名
    @@YA代表参数的开始
    第一个H代表返回值类型int
    后面的H代表int参数,M代表float参数
    @Z表示名称结束。
  • 在Linux下

_Z3Addii

_Z代表开始

3代表原本函数名的长度

Add代表原本的函数名

第一个i代表第一个参数是int

第二个i代表第二个参数是int

可以看出在Linux下g++的函数修饰后变成【_Z+函数长度+函数名+类型首字母】。

四、补充与总结

多态:用同一个东西表示不同的形态;多态分为:

  • 静态多态(编译时的多态);
  • 动态多态(运行时的多态);

函数重载就是一种静态多态;

重载函数通常用来在同一个作用域内 用同一个函数名 命名一组功能相似的函数,这样做减少了函数名的数量,避免了名字空间的污染,对于程序的可读性有很大的好处。

相关文章
|
3月前
|
存储 安全 编译器
c++入门
c++作为面向对象的语言与c的简单区别:c语言作为面向过程的语言还是跟c++有很大的区别的,比如说一个简单的五子棋的实现对于c语言面向过程的设计思路是首先分析解决这个问题的步骤:(1)开始游戏(2)黑子先走(3)绘制画面(4)判断输赢(5)轮到白子(6)绘制画面(7)判断输赢(8)返回步骤(2) (9)输出最后结果。但对于c++就不一样了,在下五子棋的例子中,用面向对象的方法来解决的话,首先将整个五子棋游戏分为三个对象:(1)黑白双方,这两方的行为是一样的。(2)棋盘系统,负责绘制画面。
41 0
|
7月前
|
存储 缓存 C++
C++ 容器全面剖析:掌握 STL 的奥秘,从入门到高效编程
C++ 标准模板库(STL)提供了一组功能强大的容器类,用于存储和操作数据集合。不同的容器具有独特的特性和应用场景,因此选择合适的容器对于程序的性能和代码的可读性至关重要。对于刚接触 C++ 的开发者来说,了解这些容器的基础知识以及它们的特点是迈向高效编程的重要一步。本文将详细介绍 C++ 常用的容器,包括序列容器(`std::vector`、`std::array`、`std::list`、`std::deque`)、关联容器(`std::set`、`std::map`)和无序容器(`std::unordered_set`、`std::unordered_map`),全面解析它们的特点、用法
C++ 容器全面剖析:掌握 STL 的奥秘,从入门到高效编程
|
6月前
|
存储 分布式计算 编译器
C++入门基础2
本内容主要讲解C++中的引用、inline函数和nullptr。引用是变量的别名,与原变量共享内存,定义时需初始化且不可更改指向对象,适用于传参和返回值以提高效率;const引用可增强代码灵活性。Inline函数通过展开提高效率,但是否展开由编译器决定,不建议分离声明与定义。Nullptr用于指针赋空,取代C语言中的NULL。最后鼓励持续学习,精进技能,提升竞争力。
|
11月前
|
程序员 C++
C++中的函数重载有什么作用
【10月更文挑战第19天】C++中的函数重载有什么作用
152 3
|
11月前
|
C++
C++入门13——详解多态2
C++入门13——详解多态2
160 1
|
11月前
|
编译器 程序员 C++
C++中的函数重载是什么
【10月更文挑战第19天】C++中的函数重载是什么
252 0
|
11月前
|
存储 安全 编译器
【C++打怪之路Lv1】-- 入门二级
【C++打怪之路Lv1】-- 入门二级
97 0
|
11月前
|
自然语言处理 编译器 C语言
【C++打怪之路Lv1】-- C++开篇(入门)
【C++打怪之路Lv1】-- C++开篇(入门)
121 0
|
11月前
|
分布式计算 Java 编译器
【C++入门(下)】—— 我与C++的不解之缘(二)
【C++入门(下)】—— 我与C++的不解之缘(二)