泛型编程:支持程序员创建函数和类的蓝图(即模板,template),而不是具体的函数和类
函数模版:
例:交换
#include<iostream>
#include<string>
template <class T>//T表示占位符
void swap(T &a, T &b)
{
T tmp;
tmp = a;
a = b;
b = tmp;
}
int main()
{
int number1 = 100,number2=200;
std::string str1 = "asdfad";
std::string str2 = "gerszvzs";
swap(number1, number2);
swap(str1, str2);
std::cout << number1 << " " << number2 << std::endl;
std::cout << str1<< " " << str2 << std::endl;
system("pause");
return 0;
}
表示swap()是一个函数模版,还可以使用spaw<int>(number1,number2)
来调用这个函数,明确告诉编译器要使用哪一类型。
其中template <class T>
并不是一个类,而是一种约定俗成,也换成typname T
在此处不用using namespace std 的原因:
在c++标准库中已经存在了一个sort函数,若用了命名空间std,会导致sort函数具有二重性而报错。有两种解决方案,换函数名字或者不用全局std命名空间。
类模板
类模板与函数模板非常相似:同样是先由你编写一个类的模板,再由编译器在你第一次使用这个模板时生成实际代码.
template <class T>
class MyClass
{
MyClass();
void swap(T &a, T &b);
}
构造器的实现如下:
MyClass::MyClass()
{
//初始化操作
}
为MyClass是一个类模板,所以不能只写出MyClass::MyClass(),编译器需要你在这里给出一种与MyClass()配合使用的数据类型,必须在尖括号里提供它.因为没有确定的数据类型可以提供,所以使用一个T作为占位符即可.
例子
mystack.h
#ifndef MYSTACK_H
#define MYSTACK_H
template <class T>
class mystack
{
public:
mystack(unsigned int size=100);
~mystack();
void push(T contain);
T pop();
private:
unsigned int size;
unsigned int sp;
T *data;
};
#endif
mystack.cpp
#include"mystack.h"
#include<iostream>
template <class T>
mystack<T>::mystack(unsigned int size)
{
this->size = size;
data = new T[size];
sp = 0;
}
template<class T>
mystack<T>::~mystack()
{
delete[]data;
}
template<class T>
void mystack<T>::push(T contian)
{
data[sp] = contian;
sp++;
}
template<class T>
T mystack<T>::pop()
{
sp--;
return data[sp];
}
main.h
#include<iostream>
#include"mystack.h"
#include<string>
int main()
{
int n = 0;
int number = 0;
std::string str;
mystack<int> Ims(n);
mystack<std::string> Sms(n);
for (int i = 1; i <= n; i++)
{
Ims.push(number);
Sms.push(str);
}
for (int i = 1; i <= n; i++)
std::cout << Ims.pop();
for (int i = 1; i <= n; i++)
std::cout << Sms.pop();
system("pause");
return 0;
}