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后的结果。

posted on 2016-08-10 23:39  A-祥子  阅读(1086)  评论(0编辑  收藏  举报

导航