首页 > 代码库 > 函数重载的总结
函数重载的总结
函数重载:
出现在相同作用域中的两个函数,如果具有相同的名字而形参表不同,则称为重载函数(overloaded function)
任何程序有且仅有一个main函数的实例,main函数不能重载。
函数重载和函数声明的区别:
如果两个函数声明的返回类型和形参表完全匹配,则将第二个声明视为第一个的重复声明。如果两个函数的形参表完全相同,但返回类型不同,则第二个声明是错误的。函数不能仅仅基于不同的返回类型而实现重载。
重载与作用域:
1 string init(); // the name init has global scope2 void fcn()3 { 4 int init = 0; // init is local and hides global init5 string s = init(); // error: global init is hidden6 }
在函数中声明的名字将屏蔽在全局作用域内声明的同名名字。这个关于变量名字的性质对于函数名同样成立。一般的作用域规则同样适用于重载函数名。如果局部地声明一个函数,则该函数将屏蔽而不是重载在外层作用域中声明的同名函数。由此推论,每一个版本的重载函数都应在同一个作用域中声明。
一般来说,局部地声明函数时一种不明智的选择。函数的声明应该放在头文件中。
在C++中,名字查找发生在类型检查之前。
函数匹配与实参转换:
函数重载确定(overloaded resolution, 即函数匹配 function matching) 是将函数调用与重载函数集合中的一个函数相关联的一个过程。
重载函数的三个步骤:
1. 候选函数
函数重载确定的第一是确定该调用所考虑的重载函数集合,该集合中的函数为候选函数(candidate function)。候选函数是与被调用的函数同名的函数,并且在调用点上,它的声明可见。
2. 选择可行函数
第二步是从候选函数选一个或多个函数,它们能够用调用中指定的实参来调用。因此,选出来的函数称为可行函数(viable function)。可行函数必须满足条件:第一,函数的形参个数与该调用的实参个数相同;第二,每个实参的类型必须与对应的形参的类型匹配,或者可以被隐式转换为对应的形参类型。
如果没有找到可行函数,则调错误。
3.寻找最佳匹配
函数重载确定的第三部就是确定与函数调用使用的市价参数匹配最佳的可行函数。这个过程考虑函数调用中的每一个实参,选择对应形参与之最匹配的一个或多个可行函数。这个所谓的“最佳”的原则是实参类型与形参类型越接近则越匹配。因此,实参类型与形参类型之间的精确类型匹配比需要转换的匹配好。
实参类型转换:
1. 精确匹配(exact match)
2. 通过类型提升(promotion)
3. 通过标准转换(standrad conversion)
4. 通过类类型转换(class-type conversion)实现的匹配
基于const形参的重载:
当参数是非引用形参时,形参与const形参的两个同名函数不能构成函数重载。下面的第二个函数只是第一个函数的重复声明。
1 A func(B);2 A func(const B); // 重复声明
仅当形参是引用或指针是,形参是否为const才有影响。
A func(B&);A func(const B&) //基于const引用形参的重载A func(B*);A func(const B*); //基于const指针形参的重载
可基于函数的引用形参是指向const对象还是指向非const对象,实现函数重载。将引用形参定义为const来重载函数是合法的,因为编译器可以根据实参是否为const
确定调用哪一个函数。
如果实参为const对象,那么将调用const引用形参的版本。如果实参为非const对象,非const对象既可以用于初始化const引用,也可以用于初始化非const引用。但是将const引用初始化为非const对象,需要转换,因为非const形参的初始化则是精确匹配。
对于指针形参也是如出一辙。如果实参是const对象,则调用带有const*类型形参的函数。否则,如果实参不是const对象,将调用带有普通指针形参的对象。
不能基于指针本身是否为const来实现函数重载。
1 A func(B*);2 A func(B *const); //重复声明,不是重载
在上述两种情况,都复制了指针,指针本身为const并没有带来区别。
类中基于const的重载:
基于成员函数是否为const,可以重载一个成员函数:同样地,基于第一个指针形参那是否指向const,可以重载一个函数。const对象只能使用const成员。非const对象可以使用任意成员,但是非const版本是一个更好的匹配。
1 class A {2 public:3 B func(int) const;4 B func(int); //基于const的重载5 };
函数重载的总结