C++中函数重载规则和底层的实现原理浅析:
一编译器调用重载函数的准则:
1将所有同名函数作为候选者
2尝试寻找可行的候选函数
3精确匹配实参
4通过默认参数能够匹配实参
5通过默认类型转换匹配实参
6匹配失败
7最终寻找到的可行候选函数不唯一,则出现二义性,编译失败
8无法匹配所有候选者,函数未定义,编译失败。
二重载底层实现(name mangling):
C++利用name mangling(倾轧)技术,来改变函数名,区分参数不同的同名函数。
实现原理:用vcifld表示void char int float long double 及其引用。
栗子:
void func(char a); //func_c(char a)
void func(char a,int b,double c); //func_cid(char a,int b,double c)
Name Mangling 简介
Name Mangling 是一种在编译过程中,将函数、变量的名称重新改编的机制。在 C++重载、namespace等操作符下,函数可以有同样的名字,编译器为了区分各个不同地方的函数,将各个函数通过编译器内定的算法,将函数改成唯一的名称。
Name Mangling翻译成中文意思为:名字修饰、名字改编等,由于对这个翻译没有统一的约定,所以本文中采用英文表示。
在写VC++程序时,我们有时会遇到类似于“error LNK2019: unresolved external symbol "void __cdecl MyFun (void)" (?MyFun@@YAXXZ) referenced in function _wmain”的连接错误,此语句中“?MyFun@@YAXXZ”是VC Name Mangling后的结果。