1.原理:名字修饰
C++之所以支持函数重载是因为C++引入了名字修饰,即将名字相同,但功能略有不同的函数,按照一定的规则改个名字。这种改名字,在我们的.cpp文件不会体现出来,而是在代码经过c++编译器编译后,生成的中间文件里,当我们调用这个函数时,这个函数和它的同名函数会按照一定的规则,被改名字,然后以改的名字来调用。
2.vs中函数重载的名字修饰
如下:
在上面我们调用了,定义了两个同名函数Add,我们通过查看编译后的中间文件的反汇编,我们发现两次调用Add,反汇编调用的函数名都是Add
但是我们注意到这两个Add的地址不同,所以这俩Add不是同一个函数,只是vs的反汇编显示了同一个名字,可能是便于我们看反汇编指令,但是在vs调用这两个同名函数是遵守名字修饰的。
我们可以把它修饰后的名字骗出来
我们在上面把函数的定义代码屏蔽掉,然后我们只声明函数,那么编译器在预处理,编译,汇编时都能顺利通过,但是最后一步的链接会报错,因为编译器找不到我们事先声明函数的定义,所以报错,通过报错,我们可以看出,编译器在处理同名函数时,用了名字修饰。
综上所述,C++编译器在遇到正确定义的同名函数时,会函数重载,函数重载的原理是名字修饰。