ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
[TOC] # 简介 c++提供了函数弭谤,实际上是建立一个通用函数.其函数类型和形参类型不具体制定,用一个虚拟的类型来代表.这个通用函数就成为函数模板. 凡是函数体相同的函数都可以用这个模板代替,不必定义多个函数,只需在模板中定义一次即可. 在调用函数时,系统会根据实参的类型来取代模板中的虚拟类型,从而实现不同函数的功能. * c++提供两种模板机制:函数模板和类模板 * 类属-类型参数化,又称参数模板 总结: * 模板把函数或者类要处理的数据类型参数化,表现为参数的多态性,成为类属 * 模板用于表达逻辑结构相同,但具体数据元素类型不同的数据对象的通用行为. **编译器还会对函数模板和类模板进行二次编译** ~~~ //让编译器看到这句话,后面紧跟着的函数里有 template<class T> void mySwap(T &a, T &b) //第一次编译 { T tmp = a; a = b; b = tmp; } void test02() { int a = 11; int b = 22; mySwap(a, b); //编译器在函数模板被调用进行二次编译,把T改为int,虚拟类型改为真实的 cout << "a = " << a << endl; cout << "b = " << b << endl; char c = 'a'; //mySwap(a, c); //err 两个参数数据类型在模板定义中是一致的 //显示的指定类型 mySwap<int>(a, b); //<>用参数列表告诉编译器我只传int类型 // mySwap<double>(a, b); //注意:指定类型,传入时不能不一致 mySwap<>(a, b); } ~~~ **隐式转换,需要参数列表** ~~~ //让编译器看到这句话,后面紧跟着的函数里有 template<class T> // template<typename T>这样也可以 T func(T a, T b) { return a + b; } void test02() { int a = 10; double b = 20.2; //如果使用参数列表指定数据类型,那么实参中可以隐式转换 //如果转换成功,就调用,转换不成功就报错 int res = func<int>(10, 20.2); //会有警告 cout << "结果是: " << res << endl; } ~~~