概念:用同一个函数名定义不同的函数 .当函数名和不同的参数搭配时,函数的含义不同
判断标准:参数个数不同 参数类型不同 参数顺序不同(至少满足一个)
函数的返回值不是函数重载的判断标准
调用准则:
将所有同名函数作为候选者,尝试寻找可行的候选函数
精确匹配实参
通过默认参数/类型转换能够匹配实参
最终寻找的可行候选函数不唯一,则出现二义性,编译失败
无法匹配所有候选者,函数位定义失败
注意事项:
重载函数在本质上是相互独立的不同函数
重载函数的函数类型是不同的(静态联编)
函数返回值不能作为函数重载的依据
函数重载是由函数名和参数列表决定的
函数重载发生在一个类里
#include<iostream> using namespace std; //重载基础部分 void myPrint(int a) { printf("a:%d\n", a); } void myPrint(int a,int b) { printf("a:%d\n", a); printf("b:%d\n", b); } void myPrint(char *p) { printf("%s\n", p); } int main01() { myPrint(1); myPrint(1, 2); myPrint("123aaaa"); system("pause"); return 0; } //函数默认参数和函数重载在一起 void myfunc(int a, int b, int c = 0) { printf("a:%d b:%d c:%d\n", a, b, c); } void myfunc(int a, int b) { printf("a:%d b:%d\n", a, b); } void main() { //myfunc(1, 2);//err system("pause"); return ; } //函数重载遇上指针 void myPrint(int a) { printf("a:%d\n", a); } void myPrint(int a, int b) { printf("a:%d\n", a); printf("b:%d\n", b); } void myPrint(char *p) { printf("%s\n", p); } //声明一个函数类型 //声明一个函数指针类型 //定义一个函数指针变量 typedef void (myTypeFunc)(int a, int b); typedef void(*myPTypeFunc)(int a, int b); void(*myVarPFunc)(int a, int b); void main() { myPTypeFunc fp; fp = myfunc; fp(1, 2); system("pause"); return ; }
函数重载与指针
当使用重载函数名对函数指针进行赋值时,根据重载规则挑选与函数指针参数列表一致的候选者,严格匹配候选者的函数类型与函数指针的函数类型
特殊情况--->const 重载
struct A { int count() { std::cout << "non const" << std::endl; return 1; } int count() const { std::cout << "const" << std::endl; return 1; } }; int main() { A a; a.count(); const A b; b.count(); }
const修饰的对象调用的是使用const修饰的 *** ,非const对象调用的是非const的 *** 。
其实到底层,函数可能会变成这样:
func(A* a);
函数是在代码段,对象是在数据段,调用不同对象的函数,其实只不过是同一个函数,传递了不同的数据参数而已。
struct A { int count(const int& s) { std::cout << "const" << std::endl; return 1; } int count(int& s) { std::cout << "non const" << std::endl; return 1; } }; int main() { A a; a.count(4); int c = 5; a.count(c); }
不只是参数类型和个数不同会产生重载,const修饰的参数也会有重载。
但是只有当const修饰的是指针或者引用类型时才可以,普通的int和const int会编译失败的