最近在学习《VC++权威剖析:MFC的原理、机制与开发实例》,这本书中一开始就指出函数的重载问题,发现自己关于函数重载的认识还是很浅显。之前一直认为重载就是编译器自动为参数匹配函数类型,然而确实从未想过是编译器经过以下步骤才进行函数匹配的:
1.具有与实参类型相同的形参的重载函数。
2.转换实参,将T转换为T&,或T&转换为T,或T转换为const T,然后寻找形参类型匹配的重载函数(T为某数据类型)。
3.实参进行标准的类型转换,如char->int->unsigned int,然后寻找形参类型匹配的重载函数。
4.使用构造函数转换实参,使其与某一重载函数匹配。例如,如果类A有构造函数A(int),那么int型的实参可以被编译器转换为类A的临时对象。
5.使用类型转换函数进行转换,使其与某一重载函数匹配。
以上是5条是摘自《VC++权威剖析:MFC的原理、机制与开发实例》,1.1,函数重载。
------------------------------------------------------------------------------------------------------------------------
对于第一条,“编译器根据具有实参类型相同的形参的重载函数”,这应该是没什么问题的。
至于第二条,什么情况下将T转换为T的引用,则是具体根据函数的定义,如果函数没有定义引用参数,则不会执行这一规则,后面的T&->T或是T->const T也是同样的道理。
对于第三条,其中的“实参进行标准的类型转换”,则应该是C++风格的类型转换,一共有4个类型转换符:
const_cast<T>(expression),dynamic_cast<T>(expression),static_cast<T>(expression),reinterpret_cast<T>(expression),其实这四个类型转换符我并没有用过,一直以来都不知道C++原来还有不同于C风格的类型转换方式,这些东西以后研究研究。
至于第四条,则是在有构造函数的情况下才会执行,至于为什么在类A中构造函数A(int)会将int型实参转换为类A的临时对象,这个还不能理解,希望以后可以弄明白,还希望看到这篇文章的大牛们能告诉我下,小弟感激不尽~
第五条则没什么问题。
我的理解还十分浅显,希望各位高手如有发现不对的地方不吝指教。