函数模板和类模板
2018-10-13 19:43 mengjuanjuan1994 阅读(152) 评论(0) 编辑 收藏 举报1. 函数模板
1.1 函数模板使用的基本方法
#include <iostream>
using namespace std;
template<class T> //只对其下面程序中的第一个函数生效
void MySwap(T &a, T &b)
{
T temp = a;
a = b;
b = temp;
}
int main()
{
int a = 2, b = 3;
MySwap(a, b); //可以自动类型推导, 也可以显示指定类型 ( MySwap<int>(a, b); )
cout << "a=" << a << ", b=" << b << endl;
system("pause");
return 0;
}
1.2 函数模板和普通模板在一起调用规则
函数模板可以被重载
c++编译器优先考虑普通函数
1.3 函数模板机制结论
编译器并不是把函数模板处理成能够处理任何类型的函数
函数模板通过具体类型产生不同的函数
编译器会对函数模板进行两次编译,在模板声明的地方对模板代码本身进行编译,在调用的地方对参数替换成的代码进行编译
2. 类模板
2.1 使用类模板时最好使用类模板的类内实现
#include <iostream>
#include <string>
using namespace std;
template<class T1, class T2>
class Person
{
public:
Person(T1 name, T2 age)
{
this->mName = name;
this->mAge = age;
}
void Show()
{
cout << mName << " " << mAge << endl;
}
public:
T1 mName;
T2 mAge;
};
int main()
{
int age = 20;
string name = "Mike";
Person<string, int> p(name, age); //必须显示指定类型
p.Show();
system("pause");
return 0;
}
2.2 尽量不在类中使用友元函数
2.3 类模板碰到static成员
类模板——> 通过具体类型产生不同的类——> 类可以定义对象,static成员为类的对象所共有
#include <iostream>
#include <string>
using namespace std;
template<class T1, class T2>
class Person
{
public:
Person(T1 name, T2 age)
{
this->mName = name;
this->mAge = age;
}
void Show()
{
cout << mName << " " << mAge << endl;
}
public:
string mName;
int mAge;
static int a;
};
//类外初始化
template<class T1, class T2>
int Person<T1, T2>::a = 0;
int main()
{
Person<string, int> p1("Mike", 20), p2("Lily", 21);
Person<char, int> p3('a', 18), p4('b', 10);
p1.a = 1;
p3.a = 2;
cout << p1.a << " " << p2.a << endl;
cout << p3.a << " " << p4.a << endl;
system("pause");
return 0;
}