在C++中允许对全局函数或者类中的方法重载,多个全局函数或类中的方法允许拥有相同的名字,前提是能被编译器正确识别:
- 全局函数如果需要重载,那么则要求函数中的参数不同,例如:void f() 和 void f(int x)是允许同时出现的,虽然名字相同,但其中的传递参数不同。但是如果相同的函数名中的参数类型相同,但其中一个被const修饰,是不允许的,例如:void f(int x)和void f(const int x)是会产生编译错误的。
- 类中的方法如需重载和全局函数的重载规则相同(如1),但是对于const修饰的方法也是被允许的,例如:void f(int x)和 void f(int x)const是允许的。例如下面的程序:
#include <iostream>
using namespace std;
string f(){ //全局函数f,返回类型为string(字符串)
return "f()";
}
string f(int arg){ //对上面的函数重载,但区别是该f有int型传递参数
return "f(int)";
}
string f(int arg1, int arg2){ //对上面的函数重载,但区别是该f有两个int型传递参数
return "f(int, int)";
}
int main(){
int i = 0, j = 0;
cout << "f()-> " << f(); //调用无传递参数的f()
cout << "\nf(i)-> " << f(i); //调用重载的f,有一个int型传递参数
cout << "\nf(i, j)-> " << f(i, j); //调用第二次重载后的函数f,区别是该f有两个int型传递参数
}
输出结果:
同样地,C++中也允许对类中的方法进行重载,如下面程序:
#include <iostream>
using namespace std;
struct A{
string f() {return "A::f()"; }
string f(int arg) { return "A::f(int)";} //对上面的方法进行重载
};
string f() {return "f()";}
string f(int arg) {return "f(int)";} //对全局函数进行重载
int main(){
int i = 0;
cout << "f()-> " << f() << endl;
cout << "f(int)-> " << f(i) <<endl; //调用全局重载函数
A a;
cout << "a.f()-> " << a.f() << endl; //调用类A中的方法
cout << "a.f(int)-> " << a.f(i) << endl; //调用类中的重载方法
}
输出结果:
如果类中的方法被const修改,则会出现优先结合的问题,具体的结合情况如下:
例如以下程序:
#include <iostream>
using namespace std;
struct A{
void f() {
cout << "void f()\n";
}
void f()const {
cout << "void f() const\n";
} //对方法f重载,加上const修饰
};
int main(){
A a1; //未被const修饰的对象a1
cout << "A a1 -> ";
a1.f(); //这里将调用未被const修饰的方法f
const A a2; //被const修饰的对象a2
cout << "A a2 -> ";
a2.f(); //调用被const修饰的方法f
}
输出结果:
若上面的结构体A中的方法f未被const重载,则对象a1与a2都将调用非const修饰的方法f,若只有被const修饰的方法f,则a1调用方法f时会产生编译错误。
如有错误,欢迎大家批评与指正!