C++ 函数重载详情介绍

 更新时间:2021年11月19日 09:10:23   作者:梁唐  
这篇文章主要介绍了C++ 函数重载详情,函数重载还有一个别名叫函数多态,函数多态是C++在C语言基础上的新特性,它可以让我们使用多个同名函数,下面来看看文章具体内容的介绍

文章转自微信公众号:Coder梁(ID:Coder_LT)

函数重载

函数重载还有一个别名叫函数多态,其实我个人感觉函数多态这个名字更好理解更恰当一些。

函数多态是C++在C语言基础上的新特性,它可以让我们使用多个同名函数。当然这些同名函数的参数是要有区别的,我们在函数调用的时候,编译器会自动根据我们传入的参数,从多个同名函数当中找到我们调用的那一个。和面向对象里的多态的概念很接近。

我们在定义函数的时候,编译器只会查看参数的数目和类型,而不会理会参数的名称。只要参数的数量以及类型不完全相同,就会被认为是不同的函数。

比如:

void print(const char *str, int width);
void print(double d, int width);
void print(long l, int width);
void print(int i, int width);
void print(const char *str);


上面列举的5个函数它们彼此之间的函数参数的数量和类型都不完全相同,因此会被视为是不同的函数。我们在使用的时候编译器会根据我们传入的参数使用对应的函数。

print('pancakes', 15); // use 1
print('pancakes');  // use 5
print(1999.0, 10);  // use 2
print(199, 23);   // use 4
print(199L, 15);  // use 3


这当然没有问题,如果我们这样使用呢:

unsigned year = 2021;
print(year, 6);


我们可以发现我们这里传入的参数类型是unsigned int,它不和任何函数的入参类型匹配。这个时候编译器并不会放弃,而是会尝试使用标准类型转换强制进行匹配。但问题来了,我们有三个版本的函数的第一个入参是数字类型,于是就有了三种变量转换的方式。这个时候C++将拒绝这种函数调用,进行报错。

同样,一些看起来彼此不同的参数也是不能共存的,比如:

double cube(double x);
double cube(double &x);


看起来一个是值传递一个是引用传递,但是对于编译器来说,显然它是无法分辨我们究竟要调用哪一个的。

还有一点需要注意,就是const修饰符。

void dribble(char *bits);   //1
void dribble(const char *bits); //2


dribble函数有两个类型,一个用于const指针,一个用于常规指针,编译器将会根据实参是否为const来决定使用哪个函数。因为将非const值赋给const变量是合法的,但反之是非法的。

另外,编译器区分函数是根据函数的参数数量和类型并不是根据函数的返回值。所以下面的两个声明是有问题的:

long gronk(int n, float m);
double gronk(int n, float m);


因为它们的参数数量以及类型都是一样的,尽管返回类型不同,但编译器依然无法区分。

这个问题经常在面试当中出现,面试官会故意挖坑问你,函数重载的依据是什么。如果两个函数的返回类型不同,但是参数一样,能不能重载。很多同学对重载的概念记忆不是非常深刻,面试的时候脑子一热就中招了,所以一定要注意。

到此这篇关于C++ 函数重载详情介绍的文章就介绍到这了,更多相关C++ 函数重载内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++ POSIX API超详细分析

    C++ POSIX API超详细分析

    这篇文章主要介绍了C++ POSIXAPI的使用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2022-11-11
  • 不要被C++(自动生成规则)所蒙骗

    不要被C++(自动生成规则)所蒙骗

    正如标题所说,我们不要被C++语法中所描述的那些条条框框所“蒙骗”了。的确,相信这些生成规则不会对我们的编程带来多大的影响(不会产生错误),但是只有了解它们的背后操作,我们才知道编译器究竟为我们做了什么,感兴趣的朋友可以了解下,希望本文对你有所帮助
    2013-01-01
  • C++ 互斥锁原理以及实际使用介绍

    C++ 互斥锁原理以及实际使用介绍

    本文主要聊一聊如何使用互斥锁以及都有哪几种方式实现互斥锁。实现互斥,可以有以下几种方式:互斥量(Mutex)、递归互斥量(Recursive Mutex)、读写锁(Read-Write Lock)、条件变量(Condition Variable)。感兴趣的同学可以参考一下
    2023-04-04
  • C++使用jsoncpp库解析Json

    C++使用jsoncpp库解析Json

    对json的解析操作是我们日常开发中经常会遇到的一个需求,下面这篇文章主要给大家介绍了关于C++使用jsoncpp库解析Json的相关资料,需要的朋友可以参考下
    2021-06-06
  • opencv平均背景法详解

    opencv平均背景法详解

    这篇文章主要为大家详细介绍了opencv平均背景法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-03-03
  • C语言宏定义容易认不清的盲区梳理

    C语言宏定义容易认不清的盲区梳理

    宏定义是C提供的三种预处理(宏定义、文件包含、条件编译)的其中一种,其主要目的是为程序员在编程时提供一定的方便,并能在一定程度上提高程序的运行效率
    2022-09-09
  • C++返回值是类名和返回值是引用的区别及说明

    C++返回值是类名和返回值是引用的区别及说明

    这篇文章主要介绍了C++返回值是类名和返回值是引用的区别及说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • CRITICAL_SECTION用法案例详解

    CRITICAL_SECTION用法案例详解

    这篇文章主要介绍了CRITICAL_SECTION用法案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • 对C语言编程标准以及声明的基本理解

    对C语言编程标准以及声明的基本理解

    这篇文章主要介绍了对C语言编程标准以及声明的基本理解,有助于对C语言编写时的结构有更加清晰的认识,需要的朋友可以参考下
    2015-11-11
  • 基于C++和MFC开发象棋程序

    基于C++和MFC开发象棋程序

    这篇文章主要为大家详细介绍了基于C++和MFC开发象棋程序,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-10-10

最新评论