💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
[TOC] # 简介 实现函数重载的条件: * 同一个作用域 * 参数个数不同 * 参数类型不同 * 参数顺序不同 # 基本语法 ~~~ //1. 函数重载条件 namespace A{ void MyFunc(){ cout << "无参数!" << endl; } void MyFunc(int a){ cout << "a: " << a << endl; } void MyFunc(string b){ cout << "b: " << b << endl; } void MyFunc(int a, string b){ cout << "a: " << a << " b:" << b << endl;} void MyFunc(string b, int a){cout << "a: " << a << " b:" << b << endl;} } //2.返回值不作为函数重载依据 namespace B{ void MyFunc(string b, int a){} //int MyFunc(string b, int a){} //无法重载仅按返回值区分的函数 } ~~~ 注意: 函数重载和默认参数一起使用,需要额外注意二义性问题的产生。 ~~~ void MyFunc(string b){ cout << "b: " << b << endl; } //函数重载碰上默认参数 void MyFunc(string b, int a = 10){ cout << "a: " << a << " b:" << b << endl; } int main(){ MyFunc("hello"); //这时,两个函数都能匹配调用,产生二义性 return 0; } ~~~ # 引用重载 ~~~ //引用的重载版本,需要引用合法内存空间 int func(const int &a) { } ~~~ # 为什么函数返回值不作为重载条件呢? 当编译器能从上下文中确定唯一的函数的时,如int ret = func(),这个当然是没有问题的。然而,我们在编写程序过程中可以忽略他的返回值。那么这个时候,一个函数为`void func(int x);`另一个为int func(int x); 当我们直接调用func(10),这个时候编译器就不确定调用那个函数。所以在c++中禁止使用返回值作为重载的条件。 # 实现原理 编译器为了实现函数重载,也是默认为我们做了一些幕后的工作,编译器用不同的参数类型来修饰不同的函数名,比如`void func();` 编译器可能会将函数名修饰成`_func`,当编译器碰到void func(int x),编译器可能将函数名修饰为`_func_int`,当编译器碰到void func(int x,char c),编译器可能会将函数名修饰为`_func_int_char`我这里使用”可能”这个字眼是因为编译器如何修饰重载的函数名称并没有一个统一的标准,所以不同的编译器可能会产生不同的内部名。 ~~~ void func(){} void func(int x){} void func(int x,char y){} ~~~ 以上三个函数在linux下生成的编译之后的函数名为: ~~~ _Z4funcv //v 代表void,无参数 _Z4funci //i 代表参数为int类型 _Z4funcic //i 代表第一个参数为int类型,第二个参数为char类型 ~~~