函数模板和类模板

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;
}

原文地址:https://www.cnblogs.com/mengjuanjuan/p/9783894.html