EasyC++37,函数重载
作者 | 梁唐
大家好,我是梁唐。
这是EasyC++系列的第37篇,来聊聊函数重载。
函数重载
函数重载还有一个别名叫函数多态,其实我个人感觉函数多态这个名字更好理解更恰当一些。
函数多态是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++系列笔记(七)
- EasyC++49,函数和语言链接性
- EasyC++60,析构函数
- EasyC++69,转换函数
- 【贪玩巴斯】C/C++文件IO流操作的 seekp和seekg详解「建议收藏」
- C++ merge函数
- 【C++】智能指针详解
- LeetCode455分发饼干c++贪心解法
- Android通过jni调用本地c/c++接口方法总结
- c++ auto类型_auto C++
- c++私有变量和公有变量_没有与指定类型匹配的重载函数实例
- c++常量和常量表达式[通俗易懂]
- C++字符串加密_c++字符串连接函数
- C++-编写类String的构造函数、析构函数和赋值函数
- C/C++ Qt QThread 线程组件应用
- C/C++递归实现全排列
- C/C++开发基础——函数对象与std::function模板
- 【C++】模板初阶
- 【C 语言】文件操作 ( 配置文件读写 | 框架搭建 | 头文件定义 | 头文件导入限制 | 兼容 C++ 语言 | 函数形参输入输出属性注释)
- 如何让C++字符串更快
- c++重载小括号,实现仿函数详解编程语言
- C++函数对象详解(附带实例)
- C++派生类的构造函数和析构函数
- C++ map,STL map详解
- C++函数定义和调用过程(超详细)
- C++继承和组合(无师自通)
- 深入C++函数映射的使用详解
- c++中string类成员函数c_str()的用法
- C++检查某个文件或目录是否存在的函数
- C++函数模板与类模板实例解析
- Lua教程(四):在Lua中调用C语言、C++的函数