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

VC++
在类VC的界面实现中加入目录树
软件换肤技术在 BCB 中的实现
利用非模窗口生成MDI介面
报表输出轻松搞定
Windows 中不规则窗体的编程实现
解说Win32的窗口子类化
使用测试优先方法开发用户界面
一个简单的登录对话框的实现
一个简单的日记本程序
从资源中加载皮肤
一个在RichEdit中添加表情图象的类
ActiveSkin 4.3 软件换肤在VC中的实现
一种另类“关于(About)”对话框的动态显示方法
对话框打印预览及打印
关于如何换肤、子类化的解决方案
制作 MSN、QQ 的消息提示窗口
如何对 BCGControlBarPro 进行换肤
定制个性化的对话框窗口类
改变窗口中的光标形状
更新MFC中的视图,跟踪.NET Framework中的事件

VC++ 中的 简单模板概念


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-30   浏览: 54 ::
收藏到网摘: 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");
}

运行一下看看?