模板又称为泛型编程(可以将类型(基本类型、自定义类型)当做参数, 进行传递)
1.函数模板
特点:只适用于函数体相同 参数个数相同 类型不同的情况。
使用
建立一个通用函数 , 其函数返回值类型和形参类型不具体制定 而是一个虚拟类型 .
int div(int a,int b)
{
return a/b;
}
void div(char a,char b)
{
}
int main()
{
div(3,2);
}
示例1:函数模板
建立一个通用函数, 其函数返回值类型和形参类型不具体制定 而是一个虚拟类型.
#include <iostream>
using namespace std;
//模板函数
template<typename T> //<>放的是 类型参数 int string char.....
void show(T s,T a)
{
cout<<"T .... "<<s<<endl;
}
int main() {
show<string>("hello","world");//<>放的是类型参数
show<int>(10,20);//<>放的是类型参数
return 0;
}
示例2:类型当做返回值类型
#include <iostream>
using namespace std;
//模板函数
template<typename T> //<>放的是 类型参数 int string char.....
T show(T s,T a)
{
cout<<"T .... "<<s<<endl;
return s;
}
int main() {
cout<<show<string>("hello","world")<<endl;//<>放的是类型参数
cout<<show<int>(10,20)<<endl;//<>放的是类型参数
return 0;
}
示例3:多类型参数
注意:使用多类型的时候,每个类型必须使用
#include <iostream>
using namespace std;
template<typename T,typename U>
T div(T a, T b, U c)
{
cout<<c<<endl;
return a/b;
}
int main()
{
cout<<div<double, string>(10, 3, "hello farsight")<<endl;
}
#include <iostream>
using namespace std;
class Person
{
int age;
public:
Person(int age):age(age){}
void show(){cout<<age<<endl;}
};
//函数模板:函数名相同,参数类型不同,个数相同
template<class T,typename U>//Person
void div(T a,T b,U num)//()参数列表 形参
{
a.show();
b.show();
T c(122);
c.show();
}
int main()
{
Person p(1);
//模板类型:自定义类型
div<Person,int>(Person(12),p,10);
return 0;
}
2.函数模板和普通函数的区别
1) 普通函数可以自动类型转换 函数模板必须显示指定类型
2) 同名的普通函数和模板函数出现,优先调用普通函数
3) 函数模板也可以发生重载
示例:优先调用普通函数
template<typename T>
void show(T b)
{
cout<<b<<endl;
}
void show(int a)
{
cout<<"show"<<endl;
}
int main()
{
show(12);//同名的普通函数和模板函数出现,优先调用普通函数
}
3.函数模板也可以发生重载
template <typename T>
T my_sum(T a,T b){
cout << "模板函数" << endl;
return a+b;
}
int my_sum(int a,char b){
cout << "普通函数"<< endl;
return a+b;
}
cout << my_sum(a,b) << endl; //普通函数
cout << my_sum<int>(a,b) << endl; //模板函数
4.类模板
示例1:成员变量
#include <iostream>
using namespace std;
template <typename T1,typename T2>
class Person{
private:
T1 age;
T2 name;
public:
Person(T1 a,T2 n):age(a),name(n){}
void show(){
cout << name << ":" << age << endl;
}
};
int main()
{
Person<int,string> p(10,"王美丽");
p.show();
return 0;
}
## 使用方法:
显示指定类型 Person<int,string> p(10," 王美丽 ");
## 泛型编程:
类型参数化
示例2:在栈和堆上创建
#include <iostream>
using namespace std;
template<typename T>
class Person
{
public:
Person(int age):age(age)
{
}
void eat(T food)
{
cout<<food<<age<<endl;
}
private:
int age;
};
int main()
{
Person<string> xiaoming(2);
xiaoming.eat("牛排");
Person<string>* p = new Person<string>(10);
p->eat("鸡排");
delete p;
}
注意:类模板不建议分文件编写,所有的函数实现都写在头文件( .h )中
结语
以上结束C++模板使用方法,本次代码分享到此结束,后续还会分享C++知识。
最后的最后,还请大家点点赞,点点关注,谢谢大家!