【c++】泛型编程

泛型编程:支持程序员创建函数和类的蓝图(即模板,template),而不是具体的函数和类

函数模版
例:交换

#include
#include

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(number1,number2)来调用这个函数,明确告诉编译器要使用哪一类型。

其中template 并不是一个类,而是一种约定俗成,也换成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

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
#include"mystack.h"
#include

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

你可能感兴趣的:(【c++】泛型编程)