C++教程-----C++模板

C++教程正在更新中,具体请查看教程目录

C++模板

C++的模板在维基百科中的解释如下:

模板(Template)指C++程序设计语言中的函数模板与类模板[1],是一种参数化类型机制,大体对应于java和C#中的泛型,但也有一些功能上的显著差异(C++模板支持后两者没有明确对应的模板模板参数和模板非类型参数,但不支持Java的通配符以及C#的泛型类型约束)。模板是C++的泛型编程中不可缺少的一部分。

模板是C++程序员绝佳的武器,特别是结合了多重继承与运算符重载之后。C++的标准函数库提供的许多有用的函数大多结合了模板的概念,如STL以及iostream。

模板是泛型编程的基础,泛型编程就是以一种独立于任何特定类型的方式进行编写代码。

模板是创建泛型类或者函数的蓝图或者公式,库容器中的迭代器或者算法都是泛型编程的例子,他们都使用了模板的概念。每个容器都有一个单一的定义,比如vector,我们可以定义许多不同类型的vector。比如vector或者vector。我们可以使用模板来洞以函数和类。

函数模板

函数模板的定义的一般形式如下所示:

template <typename type> ret-type func-name(parameter list){
    ...
}

上述模板中type是函数所使用的数据类型的占位符的名称,这个名称可以在函数的定义中使用,下面以求两数最大值为例运用函数模板:

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define R register
#define LL long long
#define pi 3.141
#define INF 1400000000
using namespace std;

template <typename T>
inline T MAX(T number1, T number2) {
	return number1 > number2 ? number1 : number2;
}

int main() {
	int a, b;
	cin >> a >> b;
	cout << MAX(a, b) << "\n";
	double c, d;
	cin >> c >> d;
	cout << MAX(c, d) << "\n";
	char e, f;
	cin >> e >> f;
	cout << MAX(e, f) << "\n";
	return 0;
}

上面的例子中的typename改为class也可以。

类模板

和我们定义函数模板的形式一样,我们同样可以定义类模板,泛型类的声明的一般形式如下所示:

template <class type> class class-name{
	...
}

此时的type是占位符的类型名称,可以在类被实例化的时候进行指定,亦可以使用一个逗号分隔的列表来定义多个泛型的数据类型。

下面的代码中定义了类Stack,并是想了用泛型的方法来对元素进行入栈出栈的操作:

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define R register
#define LL long long
#define pi 3.141
#define INF 1400000000
using namespace std;

template <class T>
class Stack {
private:
	stack<T> elems;
public:
	void push(T const & number) {
		elems.push(number);
	}
	void pop() {
		if (elems.empty()) {
			cout << "This stack is empty.\n";
		}
		else {
			elems.pop();
		}
	}
	void top();
};

template <class T>
void Stack<T> ::top() {
	if (elems.empty()) {
		cout << "This stack is empty.\n";
	}
	else {
		cout << elems.top();
	}
}

int main() {
	Stack<int> my_stack;
	my_stack.push(1);
	my_stack.top();
	my_stack.push(2);
	my_stack.push(3);
	my_stack.pop();
	my_stack.top();
	return 0;
}

C++中typename和class的区别

在C++的template中有很多地方用到了typename和class这两个关键字,而且似乎这两个关键字在一定情况下可以进行替换,那么我们的问题就是这两个关键字是否完全一样?

class用于定义类,在模板引入C++后,最初定义模板的方法为:

template<class T>......

这里的class关键字表示T是一个类型,后来为了避免class在这两个地方的使用给使用者带来混淆,因此引入typename这个关键字,这个关键字的作用和class一样表明后面的符号是一个类型,这样在定义模板的时候就可以使用下面的方式为:

template<typename T>......

在模板的定义语法中关键字class和typename的作用完全一样。

typename的另一个作用是:使用嵌套以来类型

class MyArray 
{ 
    publictypedef int LengthType;
.....
}

template<class T>
void MyMethod( T myarr ) 
{ 
    typedef typename T::LengthType LengthType; 
    LengthType length = myarr.GetLength; 
}

这个时候typename的作用就是告诉C++编译器,typename后面的字符串为一个类型名称,而不是成员函数或者成员变量,这个时候如果前面没有typename,编译器没有任何办法知道 T::LengthType 是一个类型还是一个成员名称(静态数据成员或者静态函数),所以编译不能够通过。

需要注意的点

函数模板可以进行重载,只要他们的形参表不同即可。

查看上一篇:C++重载运算符和重载函数
查看下一篇:
查看目录:C++教程目录

你可能感兴趣的:(C++程序设计教程)