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

(0)

相关推荐

  • 详解C++ 重载运算符和重载函数

    C++ 允许在同一作用域中的某个函数和运算符指定多个定义,分别称为函数重载和运算符重载. 重载声明是指一个与之前已经在该作用域内声明过的函数或方法具有相同名称的声明,但是它们的参数列表和定义(实现)不相同. 当您调用一个重载函数或重载运算符时,编译器通过把您所使用的参数类型与定义中的参数类型进行比较,决定选用最合适的定义.选择最合适的重载函数或重载运算符的过程,称为重载决策. C++ 中的函数重载 在同一个作用域内,可以声明几个功能类似的同名函数,但是这些同名函数的形式参数(指参数的个数.类型或

  • C++入门(命名空间,缺省参数,函数重载,引用,内联函数,auto,范围for)

    一.C++关键字 C++总共有63个关键字,在入门阶段我们只是大致了解一下就可,在后续博客中会逐渐讲解 二.命名空间 相信学过C++的同学,一定都写过下面这个简单的程序 #include<iostream> using namespace std; int main() { cout<<"hello world"<<endl; return 0; } 我们先来看第二行代码,using namespace std , 这行代码是什么意思呢 ? 这里我们

  • C++类重载函数的function和bind使用示例

    在没有C++11的std::function和std::bind之前,我们使用函数指针的方式是五花八门,结构很繁琐难懂.C++11中提供了std::function和std::bind统一了可调用对象的各种操作. 1.std::function简介 std::function首先是可调用对象,本质上生成了一个类(仿函数) 简单的使用如下代码 #include <unordered_map> #include <iostream> #include <functional>

  • C++之函数的重载

    目录 一.C++ 函数重载 1.重载规则 2.匹配原则 3.重载底层实现 4.extern "C" 总结 一.C++ 函数重载 C++ 致力于简化编程,能过函数重名来达到简化编程的目的 1.重载规则 1.函数名相同 2.参数的个数不同,类型不同,顺序不同,都可以构成重载 3.返回值类型必须相同,不同则不可以构成重载 例如: void func(int a); //ok void func(char a); //ok void func(char a,int b); //ok void

  • C++默认参数与函数重载及注意事项

    一.默认参数 在C++中,可以为参数指定默认值.在函数调用时没有指定与形参相对应的实参时, 就自动使用默认参数. 默认参数的语法与使用: (1)在函数声明或定义时,直接对参数赋值.这就是默认参数: (2)在函数调用时,省略部分或全部参数.这时可以用默认参数来代替. 注意: (1)默认参数只可在函数声明中设定一次.只有在没有函数声明时,才可以在函数定义中设定.(#add ,此句意为存在函数声明和定义两部分的时候.验证表明有这个限制,可以随便,但出于规范,在声明中指定) (2)如果一个参数设定了缺省

  • 详解C++之函数重载

    函数重载本质 c++中通过函数名和函数确定一个函数 所以相同的函数名,不同参数也是可以的 不同于c语言,c语言没有函数重载,函数的本质地址就是函数名 函数重载发生在同一个作用域内 类中的重载 构造函数重载 普通成员函数重载 静态成员函数重载 全局函数.静态成员函数.普通成员函数可以发生重载吗? 本质就是函数名和函数参数不同,并且发生在同一个作用域 静态函数和普通成员函数是可以的 全局函数作用域在全局作用域,所以不可以 问题1:当父类的成员函数和子类的成员函数相等,会发生重载吗? 本质还是上面说的

  • C++语法中的函数重载和默认参数

    C语言中没有函数重载 C++语言中有函数重载 函数名相同,参数个数不同.参数类型不同.参数顺序不同 例如下面就是函数重载 void sum(int a, int b){ cout << a+b << endl; } void sum(int a, double b){ cout << a+b << endl; } 返回值类型与函数重载无关 返回值类型与函数重载无关,下面代码不构成重载,编译会报错 //返回值类型与函数重载无关 int func(){ retu

  • C++ 函数重载详情介绍

    文章转自微信公众号:Coder梁(ID:Coder_LT) 函数重载 函数重载还有一个别名叫函数多态,其实我个人感觉函数多态这个名字更好理解更恰当一些. 函数多态是C++在C语言基础上的新特性,它可以让我们使用多个同名函数.当然这些同名函数的参数是要有区别的,我们在函数调用的时候,编译器会自动根据我们传入的参数,从多个同名函数当中找到我们调用的那一个.和面向对象里的多态的概念很接近. 我们在定义函数的时候,编译器只会查看参数的数目和类型,而不会理会参数的名称.只要参数的数量以及类型不完全相同,就

  • C++运算符重载详情介绍

    文章转自公众号:Coder梁(ID:Coder_LT) C++当中除了函数可以重载之外,其实运算符也是可以重载的.我们之前已经接触过一些,可能大家没有意识到. 举个例子,乘号*,运用在指针上,就是取值的意思,而运用在算数当中,则是乘法的意思.同样一个符号,用在不同的地方,起到了不同的效果.这其实就是一种重载,C++根据操作数的数目和类型来决定要使用哪一种操作. 另外C++允许将运算符重载扩展到用户自定义的类型,也就是结构体和类当中.比如,我们可以将重载加号,对两个对象相加. 其实这种用法也出现过

  • Javascript基础 函数“重载” 详细介绍

    Javascript不像其他编程语言一样具有函数签名(什么是函数签名,简单的说就是说函数的接受参数类型和参数个数,也有人认为返回类型也应该包括.具体概念大家可以到网上查询). 所以Javascript是不能像其他语言一样实现方法名相同,参数个数不同-的这类重载的,不信你可以试试: 复制代码 代码如下: function show(){             alert("1");         }         function show(num1){             a

  • C++基础学习之函数重载的简单介绍

    前言 我们在平时写代码中会用到几个函数但是他们的实现功能相同,但是有些细节却不同.例如:交换两个数的值其中包括(int, float,char,double)这些个类型.在C语言中我们是利用不同的函数名来加以区分. void Swap1(int* a, int* b); void Swap2(float* a, float* b); void Swap3(char* a, char* b); void Swap4(double* a, double* b); 我们可以看出这样的代码不美观而且给程

  • C++函数重载介绍与原理详解

    目录 函数重载 函数重载的概念 函数重载的原理(名字修饰) 总结: extern “C” 函数重载 函数重载的概念 函数重载是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表必须不同.函数重载常用来处理实现功能类似,而数据类型不同的问题. #include <iostream> using namespace std; int Add(int x, int y) { return x + y; } double Add(double x, doub

  • C++中const用于函数重载的示例代码

    常成员函数和非常成员函数之间的重载 首先先回忆一下常成员函数 声明:<类型标志符>函数名(参数表)const: 说明: (1)const是函数类型的一部分,在实现部分也要带该关键字. (2)const关键字可以用于对重载函数的区分. (3)常成员函数不能更新类的成员变量,也不能调用该类中没有用const修饰的成员函数,只能调用常成员函数. (4)非常量对象也可以调用常成员函数,但是如果有重载的非常成员函数则会调用非常成员函数. 重载看例子: #include<iostream> u

  • PowerShell中的函数重载示例

    在PowerShell中,我们可以使用Function关键字来定义一个函数,比如: Function Get-Data { Param ( [int] $data = -1 ) return $data; } 这个名为Get-Data的函数接收一个int类型的参数$data,直接将其返回.那么,我同时还需要一个接收string类型的Get-Data函数怎么办?方法比较奇怪,至少和传统的C++之类的语言不同. 在PowerShell中定义重载函数,需要指定参数所属的Parameter Set,如下

  • 深度探究C++中的函数重载的用法

    C++ 允许同一范围内具有相同名称的多个函数的规范.这些函数称为重载函数,"重载"中对其进行了详细介绍.利用重载函数,程序员可以根据参数的类型和数量为函数提供不同的语义. 例如,采用字符串(或 char *)参数的 print 函数执行的任务与采用"双精度"类型的参数的函数执行的任务截然不同.重载允许通用命名并使程序员无需创建名称,例如 print_sz 或 print_d.下表显示了 C++ 使用函数声明的哪些部分来区分同一范围内具有相同名称的函数组. 重载注意事

随机推荐