C++中函数模版和普通函数的区别
函数模版和同名普通函数在同一个作用域中,会优先调用那个函数?
函数模型在进行调用的时候会进行严格的类型匹配,而普通函数在调用的时候,会进行函数参数类型转换(前提是自动类型转换)。
调用函数模版,本质是类型参数化,将要严格的按照类型进行匹配,不会进行自动类型转换
调用普通函数,可以进行隐式的数据类型转换(前提是可以进行自动类型转换),这是普通函数和模版函数的本质区别。
函数模版可以像普通函数被重载
C++编译器优先考虑普通函数:这是因为普通函数已经存在了,而模版函数还需要进一步的判断
如果函数模版产生一个更好的匹配,那么优先选择函数模版
可以通过空模版实参列表的语法限制编译器只调用模版函数(也就是在参数名之后加上<>,隐含了自动类型推断!)
C++编译器是如何支持模版机制的。
编译器相关知识:
编译C语言用GCC,编译C++用的是G++
对于源程序的预处理,宏定义进行宏展开
编译器
汇编器
连接器
C++编译器提供的模版机制,就是通过二次编译,生成对应具体的函数,函数模版最终最终根据函数调用变成一个个函数,也就是和普通函数没有差别,也可以和普通函数发生函数重载。
编译器并不是把函数模板处理成能够处理任意类的函数
编译器从函数模板通过具体类型产生不同的函数
编译器会对函数模板进行两次编译
第一次编译在声明的地方对模板代码本身进行编译;第二次编译在调用的地方对参数替换后的代码进行编译。
模板类派生的时候要指定父类的类型,用于内存空间大小的分配。