宝杉的博客

UNIX/LINUX;ACE;SNMP;C++
posts - 33, comments - 23, trackbacks - 0, articles - 0

8-28模板

Posted on 2007-08-30 10:47 宝杉 阅读(213) 评论(0)  编辑 收藏 引用 所属分类: C++

模板是重用机制的一种工具,可以实现类型参数化,即把类型定义为参数,实现代码可重用性。

 

F:宏定义也可以实现重用,为什么不使用宏?

Q:宏避开C++类型检查机制,两个不同类型参数之间的比较将会导致错误。

 

模板,模板函数,模板类和对象之间的关系。

模板

(函数模板和类模板)

模板函数

模板类

对象

箭头代表实例化

 

模板

(函数模板和类模板)

模板函数

模板类

对象

 

例如:

C++exams\template_max

模板形参将T实例化的参数。

函数模板是一个不完全的函数,首先需要将模板形参T实例化为确定的类型。这个类型可以是预定义的,也可以是用户自定义。

 

模板函数的异常

1 先调用顺序遵循什么约定?

1)寻找类型完全匹配的函数。

2)寻找函数模板,实例化后,产生匹配的模板函数。

3)若(1)(2)失败,尝试低一级的对函数重载的方法。例如,通过类型转换。

4)(1)(2)(3)都为匹配,则是一个错误。

 

2 先了解了这样的约定,就很容易理解以下:

用非模板函数重载函数模板,只声明非模板类函数的原型,不给出函数体,而函数体借用函数模板的函数体。

例如:

template <class T>

T max( T x, T y)

{

         return( x > y )? x : y;

}

int max( int, int);

//int max 重载了函数模板的函数体;

int i;

char c;

maxi, c;

 

 

3 定义一个完整的有函数体的非模板函数。

比如:max(char, char)时,上面的函数模板不能比较比一个字符更长的字符串了。

所以,像一般的重载函数一样定义。

char *max( char *x, char *y )

{

         return ( strcmp(x, y) > 0 ) ? x y

}

char * max重载了函数模板,当调用为:

max ( “abcd”, “efgh” ); 将执行此函数。


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理