类模板、模板类、函数模板、模板函数

一:什么是类模板

  一个类模板允许用户为类定义一种模式,使得类中的某些数据成员、默认成员函数的参数、某些成员函数的返回值,能够取任意类型(包括系统预定义的和用户自定义的)

  如果一个类中数据成员的数据类型不能确定、或者是某个成员函数的参数或返回值的类型不能确定,就必须将此类声明为模板,它的存在不是代表一个具体的、实际的类,而是代表一类类。

二:类模板定义及注意事项

  template<class 模板参数表> 或者template<typename 模板参数表>

  class 类名

  {

    //类定义

  };

其中,template是声明类模板的关键字,表示声明一个模板,模板参数可以是一个,也可以是多个,可以是类型参数,也可以是非类型参数。类型参数有关键字class或typename及其后面的标识符构成,非类型参数由一个普通参数构成,代表模板定义中的一个常量。

例如:

template<class type,int width>

//type为类型参数。width为非类型参数

注意:

1):如果在全局中声明了与模板参数同名的变量,则该变量被隐藏。

2):模板参数名不能被当作模板定义中类成员的名字。

3): 同一个模板参数名在模板参数表中只能出现一次。

4):在不同的类模板或声明中,模板参数名可以被重复使用。

typedef  string  type;

template<class type,int width>

class Graphics

{

type node; //node不是string类型

typedef double type; //错误::成员名不能与模板参数type同名

};

template<class type,class type> //错误,重复使用名为type的参数

class Rect;

template<class type>  //参数名"type"在不同模板间可以重复使用

class Round;

下面我们看 一个例子:

 1 #include "stdafx.h"
 2 #include<iostream>
 3
 4 using namespace std;
 5
 6 template<typename T>
 7
 8 class myTest
 9 {
10 private:
11     T n;
12     const T i;
13 public:
14     myTest():i(0) {}
15     myTest( T k);
16     void print();
17     T operator+( T x );
18 };
19
20 template<typename T>
21 void myTest<T>::print()
22 {
23     cout << "n::" << n << endl;
24     cout << "i::" << i << endl;
25 }
26
27 template<typename T>
28 myTest<T>::myTest(T k):i(k)
29 {
30     n=k;
31 }
32
33 template<typename T>
34 T myTest<T>::operator+( T x )
35 {
36     return n+x;
37 }
38
39 int _tmain(int argc, _TCHAR* argv[])
40 {
41     myTest<int> test(2); //模板类
42     test.print();
43     cout << "test+1::" << endl;
44     cout << test+1 << endl;
45     system("pause");
46     return 0;
47 }

三:什么是模板类
  模板类其实就是类模板实例化的一个产物,举个例子:我们把类模板比作一个做饼干的模子,而模板类就是用这个模子做出来的饼干,至于这个饼干是什么味道的就要看你自己在实例化时放的是什么材料了,你可以做香草味的饼干,也可以做巧克力味的饼干,这些饼干出了材料不一样外,其它的东西都是一样的。

四:什么是函数模板

  我们知道函数的重载可以实现一个函数名多用,将功能相同或者类似函数用同一个名来定义,这样可以简化函数的调用形式,但是程序中,我们仍然需要定义每一个函数。

  而函数模板可以更加简化这个过程。所谓函数模板实际上就是建立一个通用的函数,其函数返回类型及参数列表类型不具体指定,用一个虚拟的类型来代表。这个通用函数就被称为函数模板。

  定义函数模板一般形式是:

template<typename T>

通用函数定义

或者

template<typename T>

通用函数定义

我们可以对比一下使用普通函数,使用函数的重载以及使用函数模板的情况:

1):使用普通函数

 1 #include<iostream>
 2 using namespace std;
 3 int int_add(int a,int b)                              //定义函数int_add用于int型数据相加
 4 {
 5  int c;
 6  c=a+b;
 7  return c;
 8 }
 9 double double_add(double a,double b)     //定义函数double_add用于double型函数相加
10 {
11  double c;
12  c=a+b;
13  return c;
14 }
15 int main()
16 {
17  cout<<int_add(2,8)<<endl;              //调用int_add函数
18  cout<<double_add(2.21,8.27)<<endl;  //调用double_add函数
19  return 0;
20 }

2):使用函数重载

 1 #include<iostream>
 2 using namespace std;
 3 int add(int a,int b)                              //定义函数add用于int型数据相加
 4 {
 5  int c;
 6  c=a+b;
 7  return c;
 8 }
 9 double add(double a,double b)    //定义函数add用于double型函数相加
10 {
11  double c;
12  c=a+b;
13  return c;
14 }
15 int main()
16 {
17  cout<<add(5,3)<<endl;             //调用add函数
18  cout<<add(5.35,5.5)<<endl;   //调用add函数
19  return 0;
20 }

3):使用函数模板

 1 #include<iostream>
 2 using namespace std;
 3 template<typename T>
 4 T add(T a,T b)
 5 {
 6  T c;
 7  c=a+b;
 8  return c;
 9 }
10 int main()
11 {
12  cout<<add(2,8)<<endl;
13  cout<<add(2.21,8.27)<<endl;
14  return 0;
15 }

我们可以看出使用函数模板要省出不少的代码量

五:什么是模板函数

  跟模板类类似,其实模板函数就是实例化出来的函数模板。如上例中的add(2,8)就是一个模板函数。

时间: 2024-12-14 00:19:17

类模板、模板类、函数模板、模板函数的相关文章

C++ 模板函数与模板类

一.模板函数 函数模板提供了一类函数的抽象,即代表了一类函数.当函数模板被实例化后,它会生成具体的模板函数.例如下面便是一个函数模板: 当实际调用它时,就会生成具体的模板函数:    模板函数在调用过程中会进行数据类型的自动匹配(在不产生歧义的情况下),但如果需要指定类型的话,可以显示声明,如: 这样,函数模板中的T就会被double所代替. 自动匹配有以下的规则: 1) 函数实参是否满足模板的实参(此时的判断没有数据类型的转换): 2) 若不满足1), 函数实参进行数据转换在进行匹配: 3)

C++模板学习:函数模板、结构体模板、类模板

C++模板:函数.结构体.类 模板实现 1.前言:(知道有模板这回事的童鞋请忽视) 普通函数.函数重载.模板函数 认识. //学过c的童鞋们一定都写过函数sum吧,当时是这样写的: int sum(int a,int b) { return a+b; } //实现了整数的相加 //如果再想同时实现小数的相加,就再多写个小数的相加.普通实现我就不写了,知道函数重载的童鞋们会这样写: int sum(int a,int b) {//第一个function return a+b;} double su

函数模板与类模板

函数模板,顾名思义,是在生成函数时依照的模板. 有时,我们需要对不同的数据类型做同样的函数操作. 比如:分别对一个int类型数 和 一个double类型数求平方. 这时,虽然都是同样的求平方操作(函数体内代码一样),但是我们必须要编写两个不同的函数,因为处理int类型的函数的参数和返回值类型都应该是int,而处理double类型的函数的参数和返回值都应该是double. 如下:函数体内操作代码一样,设计为重载函数,用相同的函数名,但是参数类型和返回值类型却都不一样,函数需要定义两次. int S

C++学习之模板 ----函数模板、类模板

本博文主要讨论函数模板与类模板以及其简单应用. 1).作用:函数模板和类模板都可以看做是一种代码产生器,往里面放入具体的类型,得到具体化的函数或者class. 2).编译(分为两步): a):实例化之前,先检查模板本身语法是否正确: b):根据 函数调用或者类模板调用 ,先去实例化模板代码,产生具体的函数/类. 也就是说, 没有函数调用或者类类型对象声明,就不会实例化模板代码,在目标文件obj中找不到模板的痕迹. 3):优缺点 模板的缺点是代码膨胀,编译速度慢,而优点是运行速度快. 一.函数模板

模板函数和模板类的区别

函数模板与类模板的区别 答:函数模板的实例化是由编译程序在处理函数调用时自动完成的,而类模板的实例化 必 须由程序员在程序中显式地指定. 即函数模板允许隐式调用和显式调用而类模板只能显示调用 这期间有涉及到函数模板与模板函数,类模板与模板类的概念 (类似于类与类对象的区 别) 请看下面例子 注意:模板类的函数声明和实现必须都在头文件中完成,不能像普通类那样声明在.h文件中实现在.cpp文件中,原因可以看链接http://hi.baidu.com/cn_rigel/blog/item/6cf6fc

函数模板与模板函数及模板类与模板的特化

函数模板( Function templates) * 模板(Templates)使得我们可以生成通用的函数,这些函数能够接受任意数据类型的参数,可返回任意类型的值,而不需要对所有可能的数据类型进行函数重载.这在一定程度上实现了宏(macro)的作用.它们的原型定义可以是下面两种中的任何一个: template <class identifier> function_declaration; template <typename identifier> function_decla

函数模板和类模板

一.函数模板 函数模板代表一类相同结构的函数,通过用户提供的具体参数,C++编译器在编译时刻能够将函数模板实例化,根据同一个模板创建出不同的具体函数,这些函数之间的不同之处主要在于函数内部一些数据类型的不同. 1 #include "stdafx.h" 2 #include <iostream> 3 using namespace std; 4 5 template <typename T> 6 T max1(T a,T b) 7 { 8 return a>

C++笔记(7):泛型编程和模板(函数模板和类模板)

泛型编程和模板 0.泛型编程 1.函数模板 2.类模板 ----------------------------------------------------------------------------------------------------------- 0.泛型编程 所谓泛型就是以独立于任何特定类型的方式编写代码.前面介绍的标准库的容器.迭代器和算法都是泛型编程的具体应用. 模板是泛型编程的基础.使用模板的时候不需要知道模板是如何定义的,但今天我们来介绍如何定义自己的模板类和模

【C/C++学院】0823-静态联合编译与动态联合编译/父类指针子类指针释放/虚函数/纯虚函数概念以及虚析构函数/抽象类与纯虚函数以及应用/虚函数原理/虚函数分层以及异质链表/类模板的概念以及应用

静态联合编译与动态联合编译 #include <iostream> #include <stdlib.h> //散列 void go(int num) { } void go(char *str) { } //class //::在一个类中 class A { public: void go(int num) { } void go(char *str) { } }; void main() { ///auto p = go;编译的阶段,静态联编 void(*p1)(char *s

定义模板——函数模板和类模板

面向对象编程(OOP)和泛型编程都能处理在编写程序时不知道类型的情况.不同之处在于:OOP能处理类型在程序运行之前都未知的情况:而在泛型编程中,在编译时就能获知类型了. 前面介绍的容器.迭代器和算法都是泛型编程的例子.当我们编写一个泛型程序时,是独立与任何特定类型来编写代码的.当使用一个泛型程序时,我们提供类型或值,程序实例可在其上运行. 模板是泛型编程的基础.一个模板就是一个创建类或函数的蓝图或者说公式.当使用一个vector这样的泛型类型,或者find这样的泛型函数时,我们提供足够的信息,将