当前位置: 首页 > 图文教程 > 开发语言 > VC++ > 简单模板概念

VC++
如何在运行时确定对象类型(RTTI)
FMD开发文集 -- CArchive原理
FMD开发文集 -- MFC调试模式下new操作符的特殊处理
FMD开发文集 -- MFC CObject浅析
生死疆界(下)--- 在new与delete之间
生死疆界(上)--- 在new与delete之间
Pointers 与 References(四)
Pointers 与 References(三)
Pointers 与 References(二)
Pointers 与 References(一)
介绍一个专门处理C++异常的类和例子
关于构造单实例类的一个问题
模板友元化
C++中类的数据成员的安全隐患
关于对象生命历程的会话
接触VC之二:MFC类基础,C++程序编写规范介绍
内联汇编基础知识
命名空间的概念
捕获数学函数异常
MMX指令集在C++中的使用

VC++ 中的 简单模板概念


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-30   浏览: 44 ::
收藏到网摘: n/a

简单模板概念
作者:acute

提交者:eastvc 发布日期:2003-7-12 21:11:34
原文出处:http://how.digichina.net/program/c/00000243.htm


我以前关于模板的理解都是断断续续的,于是准备系统的专研一遍,以为得花去一两天的时间,没想到,不到一个上午,就完成了计划,回头一看,模板也无非就如此而已吗!于是,这篇的题目就叫“简单模板概念”。
抛去其他有关书和资料的讲法,我将按照我自己的理解以简单的语言描述模板。

(当然,实际上模板有它自己复杂的一面,呵呵,俺不讨论这个)

1. 模板的作用<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

哼!为什么一个类一个函数就只能用固定的数据类型呢?我只是类型不一样,可是处理上是完全相同的啊,这样代码重复率大大的增加了啊!有没有搞————错!

这是我以前愤愤不平的事情,直到我发现了模板,呵呵,那可是个好东西。它可以增加代码重用率。它使用非特定类型定义类或函数,到使用的时候再用特定的类型代替它们。

N,为了减少代码冗余和文字重用率,这里就不举例子了,在以下两节中举例。

2. 类模板

在类的定义中使用模板是我们最——常见的了,你看看,有ATL,有STL,呵呵,好多。

关——键字(周星驰语气):template

关键符号:<>

说关键的就是关键,上面的两个少了可不行,怎么用呢?看完下面这个简单的例子,你马上就会了:

#include <iostream.h>
template <class T>
class myclass{
T temp;
public:
myclass(T name){
temp=name;
}

T vomit(){
return temp;
}
};

void main()
{
myclass<int> t1(2);
cout<<t1.vomit()<<endl;
myclass<char*> t2("醉拳");
cout<<t2.vomit()<<endl;
myclass<float> t3(3.14159);
cout<<t3.vomit()<<endl;
}

千万别告诉我你没看明白,要不然,考下来执行一遍,别告诉我你不会怎么执行啊!倒~~~看到没有,在通常的类的定义前面加上template<class T>,这样T就是这个类中可以使用的类型了。在使用的时候类名和T要一起用才能正确表示这个类,并且用确定的类型代替这个T,就象上面写的myclass<int>,myclass<char*>之类的。OK,就这么简单。

注意函数vomit(谁能说出它的英文意思?呵呵),在这里是用内联函数实现的,那把他放到类的外面去呢?该怎么定义?呵呵,就象下面这样子啊:

template <class T>
T myclass<T>::vomit(){
return temp;
}

首先,前面加上和类定义一样的template <class T>,类名一定要注意,是myclass<T>而不是myclass。

OK,类模板知道这些就可以啦。

3. 函数模板

和类模板一样,函数也可以用好多类型来实现代码重用,举个例子得了,别不多说,自己看,或者运行一下,我都举的是很简单的例子,旨在揭示原理:

#include <iostream.h>
template <class T>
void f(T qie)
{
cout<<qie<<endl;
}

#define X f<char*>

void main()
{
f<int>(3);
f<char>('r');
X("aadf");
}

运行一下看看?