一、定义

1.1 C++支持在同一作用域中出现同名函数,但是要求这些同名函数的形参不同,可以是参数个数不同、顺序不同或者类型不同。这样C++函数调用就表现出了多态行为,使用更灵活。C语言是不支持同一作用域中出现同名函数的,这是由于在编译过程中的名字修饰(name Mangling)的不同。

函数重载_函数重载

1.2 而不同域出现的同名函数时,一般是不同命名空间里面的同名函数。但是如果同时展开同名函数并使用时,也需要保证这些同名函数的形参不同从而构成重构函数,或者指定展开使用,不然会出现调用歧义。

函数重载_函数重载_02

改正如下:指定命名空间展开

#include<iostream>
using namespace std;

namespace a1 {
	void add(int a, double b) {
		cout << a + b << endl;
	}
}

namespace a2 {
	void add(int b, double a) {
		cout << a + b << endl;
	}
}

using namespace a1;
using namespace a2;

int main() {
	int a = 1,b=2;
	a1::add(a, b);
	a2::add(a, b);
	return 0;
}

1.3 返回值不作为评判函数重载的标准

二、使用注意

2.1尽量避免依赖于隐式类型转换来区分不同的函数版本,应该通过参数的明确类型来清晰地定义函数,从而减少潜在的混淆和错误。

函数重载_函数重载_03

2.2满足定义,构成函数重载,但是出现了调用歧义

函数重载_函数重载_04