前言
函数重载是 C++ 编程的一个特性,它允许我们有多个具有相同名称但不同参数列表的函数,当我说参数列表时,它表示参数的数据类型和顺序,例如函数myfuncn(int a, float b)的参数列表是(int, float),它与函数myfuncn(float a, int b)参数列表(float, int)不同。函数重载是编译时多态。
重载规则
现在我们知道什么是参数列表,让我们看一下重载规则:我们可以在同一范围内拥有以下函数。
print(int num1, int num2)print(int num1, int num2, int num3)print(int num1, double num2)记住这条规则的最简单方法是参数应符合以下任何一个或多个条件,它们应具有不同的类型,数量或顺序的参数。
例如:
这两个函数有不同的参数类型:
print(int num1, int num2)print(double num1, double num2)这两个的参数数量不同:
print(int num1, int num2)print(int num1, int num2, int num3)这两个有不同的参数顺序:
print(int num1, double num2)print(double num1, int num2)以上三种情况都是有效的重载情况。我们可以有任意数量的函数,只需记住参数列表应该是不同的。例如:
int print(int, int)double print(int, int)由于参数列表相同,因此不允许这样做。尽管它们具有不同的返回类型,但它无效。
函数重载例1
函数重载指的是一个作用域内的几个函数名字相同但是形参列表不同。
#include <iostream>#include <string>using namespace std;class Test{public:void print(int i){cout <<"int: "<<i<<endl;}void print(double f){cout <<"float: "<<f<<endl;}void print(string s){cout <<"string: "<<s<<endl;}};int main(int argc, char const *argv[]){Test test;test.print(50);test.print(89.5);test.print("minger");return 0;}编译结果:
函数重载例2
正如我在本指南开头所提到的,具有不同返回类型和相同参数列表的函数不能重载。但是,如果函数具有不同的参数列表,则它们可以具有相同或不同的返回类型,以便有资格进行重载。简而言之,函数的返回类型在函数重载中不起任何作用。重要的是函数的参数列表。
#include <iostream>using namespace std;class DemoClass {public: int print(int i) { return i; } double print(double d) { return d; }};int main(int argc, char const *argv[]) { DemoClass obj; cout<<obj.print(100)<<endl; cout<<obj.print(5005.516)<<endl; return 0;}编译输出:
C++的重载函数与转换构造函数
当我们调用重载的函数时,从多个数类型转换中进行选择将变得更复杂。如果两个或者多个类型转换都提供了同一种可行匹配,则这些类型转换一样好。
举个例子,当几个重载函数的参数分属不同的类类型时,如果这些类恰好定义了同样的转换构造函数,则二义性问题将进一步提升:
如果在调用重载函数时候,我们需要使用构造函数或者强制类型转换来改变实参类型。避免二义性发生。
C++ 有哪些函数不能重载
析构函数不能重载 ,因为析构函数只能有一个,且不能带参数。析构函数是系统自动调用的,是没有参数表的 。
main函数不能重载
这是在C++ 11标准中说明的:
A program shall contain a global function called main, which is the designated start of the program....This function shall not be overloaded.试想如果作为用户程序入口函数的main函数被重载了,那么加载的时候该以哪个为入口呢?
重载函数返回值不同、形参名不同都是不能重载的
double print(const A&);int print(const A&);编译会出错,仅有返回值不同是不可以重载的
int print(const A&test1);int print(const A&test2);编译会出错,仅仅是形参名不同,不可以重载。同名函数的形式参数(指参数的个数、类型或者顺序)必须不同。
总结
函数重载是在同一个作用域内,可以声明几个功能类似的同名函数,但是这些同名函数的形式参数(指参数的个数、类型或者顺序)必须不同。不能仅通过返回类型的不同来重载函数。
欢迎关注公众号【程序猿编码】,添加本人微信号(17865354792),回复:领取学习资料,网盘资料有如下: