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++ 函数重载内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Qt实现计算器功能

    Qt实现计算器功能

    这篇文章主要为大家详细介绍了Qt实现计算器功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • QT已有项目导入工程时注意事项图文详解

    QT已有项目导入工程时注意事项图文详解

    QT开发这几年大大小小项目做了不少,花了点时间对知识点总结整合了一部分,下面这篇文章主要给大家介绍了关于QT已有项目导入工程时注意事项的相关资料,需要的朋友可以参考下
    2023-11-11
  • C++多重继承二义性原理实例解析

    C++多重继承二义性原理实例解析

    这篇文章主要介绍了C++多重继承二义性原理实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-06-06
  • C/C++ break和continue区别及使用方法

    C/C++ break和continue区别及使用方法

    这篇文章主要介绍了C/C++ break和continue区别及使用方法的相关资料,需要的朋友可以参考下
    2017-07-07
  • Qt结合libqrencode生成二维码的实现示例

    Qt结合libqrencode生成二维码的实现示例

    本文主要介绍了Qt结合libqrencode生成二维码的实现示例,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • 浅谈C++中virtual的三种用法

    浅谈C++中virtual的三种用法

    这篇文章主要介绍了浅谈C++中virtual的三种用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • C语言汇编分析传递结构体指针比传递结构体变量高效的深层原因

    C语言汇编分析传递结构体指针比传递结构体变量高效的深层原因

    本文章使用的工具是vs2010,本篇文章主要讲解结构体指针作为参数传递与结构体变量作为参数传递的对比,不谈值传递与址传递的概念
    2022-10-10
  • C++11 写一个只触发一次槽函数的Qt connect函数

    C++11 写一个只触发一次槽函数的Qt connect函数

    这篇文章主要为大家介绍了C++11 写一个只触发一次槽函数的Qt connect函数实例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • C++ STL容器适配器使用指南

    C++ STL容器适配器使用指南

    C++ STL(标准模板库)是一套功能强大的 C++ 模板类,提供了通用的模板类和函数,这些模板类和函数可以实现多种流行和常用的算法和数据结构,如向量、链表、队列、栈,今天我们来探究一下stl容器适配器的使用吧
    2021-11-11
  • static关键字的作用详解

    static关键字的作用详解

    在C语言中,static的字面意思很容易把我们导入歧途,其实它的作用有三条。
    2013-04-04

最新评论