我们知道,函数重载是指在同一作用域内,可以有一组具有相同函数名,不同参数列表的函数,这组函数被称为重载函数
那么为什么我们不能通过返回类型的不同来进行函数重载?
因为在编译中,每一个函数都会按照一定的规则进行映射
test.cpp
1 | namespace t{ |
然后我们查看它的汇编代码
1 | g++ -g -c test.cpp |
1 | 1.o: file format Mach-O 64-bit x86-64 |
从上面我们不难看出
- __ZN1t4testEf int t::test (int)
- __ZN1t4testEv: float t::tset(void)
- __Z4testf : float test(float i)
- __Z4testi : int test(int)
- __Z6outputfi : float output(float, int)
根据上面的对比,我们大致可以推断出命名规则为作用域+函数名+参数类型
例如 : ZN1t4
和Z4
代表两个不同的作用域
而output
的Z6 output fi
中的fi
则表示的是参数类型,f表示float,i表示int
综上所述,映射后的函数名完全没有返回值什么事,当你调用一个函数,编译器首先要看看函数名列表,然后根据你的参数进行一个匹配
重载中最重要的就是对应函数的查找,为了正确查找函数,我们不能定义两个参数类型和函数名一样的函数,这是编译器生成的代码规则所决定的
如果你两个函数的作用域,函数名,参数类型都一样,那么也查找不到对应的函数了,如下(错误的代码)
1 | //汇编之后的函数名(用下划线分割规则) |
这就是为什么不能仅仅通过返回值类型不同来进行重载