C++入门学习(3)函数重载

简介: C++入门学习(3)函数重载

上期回顾

 在上回,我们学习了缺省参数,了解了缺省参数是为了解决C语言中的形参没有缺省值的情况,还学会了如何使用缺省参数和缺省参数的使用规则,比如在函数调用的时候,我们传入形参必须从左往右依次传入,在形参给缺省值的时候,必须从右往左依次给等等。那今天我们也要继续努力呀!接下来就让我们进入今天的学习----函数重载。

一、函数重载的诞生背景


   我们还是先解释一下函数重载是什么意思?

       所谓“重载”就相当于我们的一词多义,我们可以通过上下文的语境来判断这个词的意思,这样的词就是被“重载”了,所以我们的函数重载也不例外,函数名相同,但是表达的意思却不同,那函数重载产生的背景是什么呢?


我们来看下面这段错误代码:(C语言中的重名)

#include <stdio.h>
int Add(int x,int y)
{
    return x + y;
}
double Add(double x,double y)
{
    return x + y;
}
int main()
{
    return 0;
}

再看正确的写法:(解决C语言的重名)

#include <stdio.h>
int Add1(int x,int y)
{
    return x + y;
}
double Add2(double x,double y)
{
    return x + y;
}
int main()
{
    return 0;
}


其实在我们C语言中,函数在运用的时候,是不允许重名的,当函数重名的时候,我们的编辑器是无法分辨哪个才是这个函数,就会报错。(至于为什么不允许,作者会加快速度出一篇博客专门讲解一下,我们现在可以暂时不考虑)


       我们就必须写Add1和Add2才可以解决问题,这样其实给人的感觉很乱,所以在C++这里就允许函数的重名定义,但是在C++里又是怎么区分的呢?


       接下来就让我们来展开对函数重载的学习吧!

二、函数重载的定义

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


所以在C++中我们可以这样解决:

#include <iostream>
int Add(int x,int y)
{
    return x + y;
}
double Add(double x,double y)
{
    return x + y;
}
int main()
{
    Add(1,2);
    Add(1.1,2.2);
    return 0;
}

在了解定义之后,我们会看到在C++里是根据同名函数的形参列表中的参数个数不同、参数类型不同和参数的类型顺序不同来区分同名函数的,所以这也就给函数重载的分类提供了种类。

三、函数重载的分类

3.1 函数形参的参数个数不同

当我们的形参的参数个数不同时,可以构成函数重载

#include <iostream>
int Add(int x,int y,int z)
{
    return x + y + z;
}
int Add(int x,int y)
{
    return x + y;
}
int main()
{
    Add(1,2);
    Add(1,2,3);
    return 0;
}


3.2 函数形参的参数类型不同

当我们的形参的参数类型不同时,可以构成函数重载

int Add(int x,int y)
{
    return x + y;
}
double Add(double x,double y)
{
    return x + y;
}
int main()
{
    Add(1,2);
    Add(1.1,2.2);
    return 0;
}



3.3 函数形参的参数类型的顺序不同

当我们的形参的参数类型的顺序不同时,可以构成函数重载

#include <iostream>
using namespace std;
void Print(int x,char y)
{
    cout << x << y << endl;
}
void Print(char x,int y)
{
    cout << x << y << endl;
}
int main()
{
    Print('a',1);
    Print(1,'a');
    return 0;
}

四、函数重载和缺省参数

那我们的函数重载和缺省参数是否可以一起用呢?我们来看下面的代码:

我们的确构成重载,但是在我们没有传参数的时候,就不对了,编辑器不知道,你要调用的是哪一个函数,所以在函数重载和缺省参数都存在的时候,一定不要不传参!

#include <iostream>
using namespace std;
// 构成重载,不传参数的时候调用存在二义性
void f()
{
    cout << "f()" << endl;
}
void f(int a = 0)
{
  cout << "f(int a)" << endl;
}
int main()
{
    f();
    return 0;
}


相关文章
|
4月前
|
存储 安全 编译器
c++入门
c++作为面向对象的语言与c的简单区别:c语言作为面向过程的语言还是跟c++有很大的区别的,比如说一个简单的五子棋的实现对于c语言面向过程的设计思路是首先分析解决这个问题的步骤:(1)开始游戏(2)黑子先走(3)绘制画面(4)判断输赢(5)轮到白子(6)绘制画面(7)判断输赢(8)返回步骤(2) (9)输出最后结果。但对于c++就不一样了,在下五子棋的例子中,用面向对象的方法来解决的话,首先将整个五子棋游戏分为三个对象:(1)黑白双方,这两方的行为是一样的。(2)棋盘系统,负责绘制画面。
51 0
|
8月前
|
存储 缓存 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 的奥秘,从入门到高效编程
|
7月前
|
存储 分布式计算 编译器
C++入门基础2
本内容主要讲解C++中的引用、inline函数和nullptr。引用是变量的别名,与原变量共享内存,定义时需初始化且不可更改指向对象,适用于传参和返回值以提高效率;const引用可增强代码灵活性。Inline函数通过展开提高效率,但是否展开由编译器决定,不建议分离声明与定义。Nullptr用于指针赋空,取代C语言中的NULL。最后鼓励持续学习,精进技能,提升竞争力。
|
9月前
|
C++ 开发者
C++学习之继承
通过继承,C++可以实现代码重用、扩展类的功能并支持多态性。理解继承的类型、重写与重载、多重继承及其相关问题,对于掌握C++面向对象编程至关重要。希望本文能为您的C++学习和开发提供实用的指导。
136 16
|
10月前
|
算法 网络安全 区块链
2023/11/10学习记录-C/C++对称分组加密DES
本文介绍了对称分组加密的常见算法(如DES、3DES、AES和国密SM4)及其应用场景,包括文件和视频加密、比特币私钥加密、消息和配置项加密及SSL通信加密。文章还详细展示了如何使用异或实现一个简易的对称加密算法,并通过示例代码演示了DES算法在ECB和CBC模式下的加密和解密过程,以及如何封装DES实现CBC和ECB的PKCS7Padding分块填充。
203 4
2023/11/10学习记录-C/C++对称分组加密DES
|
12月前
|
编译器 C语言 C++
配置C++的学习环境
【10月更文挑战第18天】如果想要学习C++语言,那就需要配置必要的环境和相关的软件,才可以帮助自己更好的掌握语法知识。 一、本地环境设置 如果您想要设置 C++ 语言环境,您需要确保电脑上有以下两款可用的软件,文本编辑器和 C++ 编译器。 二、文本编辑器 通过编辑器创建的文件通常称为源文件,源文件包含程序源代码。 C++ 程序的源文件通常使用扩展名 .cpp、.cp 或 .c。 在开始编程之前,请确保您有一个文本编辑器,且有足够的经验来编写一个计算机程序,然后把它保存在一个文件中,编译并执行它。 Visual Studio Code:虽然它是一个通用的文本编辑器,但它有很多插
372 6
|
12月前
|
程序员 C++
C++中的函数重载有什么作用
【10月更文挑战第19天】C++中的函数重载有什么作用
161 3
|
12月前
|
编译器 程序员 C++
C++中的函数重载是什么
【10月更文挑战第19天】C++中的函数重载是什么
293 0
|
8月前
|
编译器 C++ 开发者
【C++篇】深度解析类与对象(下)
在上一篇博客中,我们学习了C++的基础类与对象概念,包括类的定义、对象的使用和构造函数的作用。在这一篇,我们将深入探讨C++类的一些重要特性,如构造函数的高级用法、类型转换、static成员、友元、内部类、匿名对象,以及对象拷贝优化等。这些内容可以帮助你更好地理解和应用面向对象编程的核心理念,提升代码的健壮性、灵活性和可维护性。