C++中的函数重载

在C++中允许对全局函数或者类中的方法重载,多个全局函数或类中的方法允许拥有相同的名字,前提是能被编译器正确识别:

  1. 全局函数如果需要重载,那么则要求函数中的参数不同,例如:void f() 和 void f(int x)是允许同时出现的,虽然名字相同,但其中的传递参数不同。但是如果相同的函数名中的参数类型相同,但其中一个被const修饰,是不允许的,例如:void f(int x)和void f(const int x)是会产生编译错误的。
  2. 类中的方法如需重载和全局函数的重载规则相同(如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时会产生编译错误。

如有错误,欢迎大家批评与指正!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值