什么是函数模板和类模板
函数模板是一种抽象函数定义,它代表一类同构函数。通过用户提供的具体参数,C++编译器在编译时刻能够将函数模板实例化,根据同一个模板创建出不同的具体函数,这些函数之间的不同之处主要在于函数内部一些数据类型的不同,而由模板创建的函数的使用方法与一般函数的使用方法相同。函数模板的定义格式如下:
templateFunction_Definition
其中,Function_Definition为函数定义;TYPE_LIST被称为类型参数表,是由—系列代表类型的标识符组成的,其间用逗号分隔,这些标识符的通常风格是由大写字母组成,ARG_LIST称为变量表,其中含有由逗号分隔开的多个变量说明,相当于一般函数定义中的形式参数。前面例题中的 max就是函数模板的一个例子,因此这里不再另外举例。
C++提供的类模板是一种更高层次的抽象的类定义,用于使用相同代码创建不同类模板的定义与函数模板的定义类似,只是把函数摸板中的函数定义部分换作类说明,并对类的成员函数进行定义即可。在类说明中可以使用出现在TYPE_LIST中的各个类型标识以及出现在ARG_LIST中的各变量。
1 template<模版参数表>
2 class<类模板名>
3 {<类模板定义体>},
例如我们需要定义一个表示平面的点(Point)类,这个类有两个成员变量分别表示横坐标和纵坐标,并且这两个坐标的类型可以是int、float、 double等等类型。因此可能写出类似Point_int_int、Point_float_int、Point_float_float等这样的类。通过类模板,我们只需要写一个类。
1 #include
2 using namespace std;
3
4 template
5 class Point_T
6 {
7 public:
8 T1 a; //成员a为T1类型
9 T2 b; //成员b为T2类型
10 Point_T() : a(0), b(0) {} //默认构造函数
11 Point_T(T1 ta, T2 tb) : a(ta), b(tb) {} //带参数的构造函数
12 Point_T& operator=(Point_T &pt); //赋值函数
13 friend Point_T operator +(Point_T &pt1, Point_T &pt2); //重载+
14 };
15
16 template
17 Point_T& Point_T::operator=(Point_T &pt) //赋值函数
18 {
19 this->a = pt.a;
20 this->b = pt.b;
21 return *this;
22 }
23
24 template
25 Point_T operator +(Point_T &pt1, Point_T &pt2) //重载+
26 {
27 Point_T temp;
28 temp.a = pt1.a + pt2.a; //结果对象中的a和b分别为两个参数对象的各自a和b之和
29 temp.b = pt1.b + pt2.b;
30 return temp;
31 }
32
33 template
34 ostream& operator << (ostream& out, Point_T& pt) //重载输出流操作符
35 {
36 out << "(" << pt.a << ", "; //输出(a, b)
37 out << pt.b << ")";
38 return out;
39 }
40
41 int main()
42 {
43 Point_T intPt1(1, 2); //T1和T2都是int
44 Point_T intPt2(3, 4); //T1和T2都是int
45 Point_T floatPt1(1.1f, 2.2f); //T1和T2都是float
46 Point_T floatPt2(3.3f, 4.4f); //T1和T2都是float
47
48 Point_T intTotalPt;
49 Point_T floatTotalPt;
50
51 intTotalPt = intPt1 + intPt2;//类型为Point_T的对象相加
52 floatTotalPt = floatPt1 + floatPt2; //类型为Point_T的对象相加
53
54 cout << intTotalPt << endl; //输出Point_T的对象
55 cout << floatTotalPt << endl; //输出Point_T的对象
56
57 return 0;
58 }
Point_T类就是一个类模板,它的成员a和b分别为T1和T2类型,这里我们还实现了它的构造函数、赋值函数、“+”运算符的重载以及输出流操作符“<<”的重载。
使用Point_T类非常方便,我们可以进行各种类型的组合。
代码43、44行,定义了两个Point_T类的对象intPt1和intPt2,表明这两个对象的成员a和b都是int类型。
代码45、46行,定义了两个Point_T类的对象floatPt1和floatPt2,表明这两个对象的成员a和b都是float类型。
代码51行,对intPt1和intPt2进行对象加法,结果保存到intTotalPt中,此过程先调用“+”函数,再调用了“=”函数。
代码52行,与51行类似,只是相加的对象和结果对象都是Point_T类的对象。
代码54、55行,输出对象intTotalPt和floatTotalPt的内容。
可以看出,通过使用类模板Point_T我们可以创建不同的类,大大提高了代码的可维护性以及可重用性。
有一些概念需要区别:函数模板与模板函数,类模板和模板类是不同的意思
函数模板的重点是模板,它表示的是一个模板,用来生产函数。例如前面例题的max是一个函数模板。而模板函数的重点是函数,它表示的是由一个模板生成而来的函数。例如max,max等都是模板函数。
类模板和模板类的区别与上面的类似,类模板用于生产类,例如Point_T就是一个类模板。而模板类是由一个模板生成而来的类,例如Point_T和Point_T都是模板类。
函数模板和类模板有什么区别?
在面试例题1的程序代码中,我们在使用函数模板max时不一定要必须指明T的类型,函数模板max的实例化是由编译程序在处理函数调用时自动完成的,当调用max(1, 2)时自动生成实例max,而调用max(1.1f, 2.2f)时自动生成实例max。当然也可以显示指定T的类型。
对于本例题的类模板Point_T来说,其实例化必须被显示地指定,比如Point_T、Point_T。
答案:
函数模板是一种抽象函数定义,它代表一类同构函数。类模板是一种更高层次的抽象的类定义。
函数模板的实例化是由编译程序在处理函数调用时自动完成的,而类模板的实例化必须由程序员在程序中显式地指定。
类模板不能嵌套(局部类模板)。
类模板中的静态成员仅属于实例化后的类(模板类),不同实例之间不存在共享。
分享到:
相关推荐
模板分为两种主要类型:函数模板和类模板。本文将深入探讨这两种模板的概念、工作原理以及如何通过实例来理解和应用它们。 首先,我们来看函数模板。函数模板是一种通用的函数定义,它不绑定到特定的数据类型。当...
在示例中,`abs`函数就是一个模板函数,它可以接受整型(int)和浮点型(double)等不同类型的参数,并返回对应的绝对值。 2. **实例化与类型推导**: 当函数模板被调用时,编译器会根据传递的实际参数类型自动推断模板...
模板分为两种主要类型:函数模板和类模板。 函数模板是C++中用于创建泛型函数的关键工具。它们允许你定义一个函数,该函数可以处理多种数据类型,而无需为每种类型单独编写代码。函数模板的定义通常以`template`...
### MATLAB S-函数标准模板详解 #### 概述 MATLAB 的 M 文件 S 函数(System Function)是一种高级编程接口,允许用户自定义模块的行为,从而实现更复杂、更精细的控制逻辑。S 函数可以处理连续系统、离散系统或...
通过阅读和学习这些代码,你将更深入地理解函数模板在排序问题中的应用,以及如何在实际项目中灵活运用这些技巧。 总之,掌握函数模板的使用是C++程序员必备的技能之一,特别是在处理泛型编程和算法实现时。在...
"500个Excel函数模板.zip"这个压缩包正是为了帮助用户深入了解和熟练运用Excel而精心编排的资源库。下面将详细介绍其中涉及的几个核心知识点:Excel VBA、Excel绘图以及Excel透视表。 1. **Excel VBA(Visual Basic...
总结起来,这个“支持类模版的C++双向链表”示例深入地讲解了C++中的模板机制,包括类模版和函数模版的使用,以及如何结合这些模板技术实现一个通用的双向链表。通过这个示例,我们可以更深入地理解泛型编程,以及...
C语言编写S函数时,通常会遵循MATLAB提供的特定模板,包括几个关键的函数定义,如`simulink.c`或`ssFunction.c`。 1. **初始化函数**:这是S函数的入口点,通常命名为`sfuntmpl_init()`。在这个函数中,我们会设置S...
在 main 函数中,我们可以看到如何使用这个冒泡排序算法的C++函数模板来排序整数数组和浮点数数组。首先,我们定义了一个整数数组a和一个浮点数数组b,然后使用BubSort函数对它们进行排序。最后,我们输出排序后的...
这种模板可能包括预设的代码片段、类结构或者函数库,适用于不同的编程语言或特定的项目需求。 【描述】"2023年个人在用easyCode模版"表明这是作者个人在2023年期间使用的模板,这可能意味着这些模板经过了一段时间...
本文将深入探讨类模板和函数模板的全特化与偏特化。 一、类模板全特化与偏特化 1. 全特化(Full Specialization) 全特化是指为类模板或函数模板指定一个完全特定的类型参数列表,创建一个独立的非模板类或函数。...
可定义函数模板和类模板,使代码生成更加通用化。 说明:这需要事先安装.net framework 3.5 。这个完全出自本人之手。有什么建议望指正。 邮箱:hp_co@qq.com 。 类似于李天平的,但那个太死了,这个可以...
在使用这个类时,我们可以通过传递参数到构造函数来定制其行为,比如指定模板文件的位置,或者设定模板引擎的解析规则。 获取模板文件内容是解析类的一个关键功能。这个过程通常包括读取模板文件,然后使用正则...
回调函数和模板模式都是软件设计中用于实现代码复用和扩展的重要工具,它们在不同的场景下各有优势。模板模式是一种行为设计模式,它定义了一组操作的算法骨架,同时允许子类在某些步骤中替换具体行为。而回调则是...
在编程领域,尤其是在C++中,模板类是一种强大的工具,它允许我们创建泛型代码,以处理各种数据类型。...理解和运用这个模版类,不仅可以提升代码的可复用性和效率,还能加深对C++模板机制的理解。
函数模板`max`是一个泛型函数,它可以接受三种不同类型的数据(T1、T2和T3),并返回它们之间的最大值。 首先,让我们来看看提供的代码: ```cpp #include<iostream.h> // 注意:在现代C++中,应使用 template, ...
给定一个头文件Vec.h,其中有抽象类模板VECROR设计。还有插入运算符重载、抽取运算符重载的普通c++函数...1、将类模板VECTOR作为基类,通过公共继承派生一个新的类模板Vector(向量类)和一个新的自定义字符串了String。
有两类模板:函数模板和类模板。函数模板用于创建可以处理多种类型的函数,而类模板用于创建可以适应多种类型的类。 例如,一个简单的函数模板用于交换两个变量的值: ```cpp template void swap(T& a, T& b) { ...
本教程将深入探讨如何结合模板类和函数重载来实现矩阵的加减乘除运算。 首先,我们需要定义一个模板类`CMatrix`,用于表示矩阵。模板类的定义通常如下: ```cpp template class CMatrix { public: // 构造函数,...
计算几何是计算机科学中的一个重要分支,它涉及到二维和三维空间中的几何对象的处理。这篇文档提供了计算几何中一些常见的函数模板,涵盖...这些函数模版为实际编程提供了基础工具,帮助开发者高效地处理计算几何问题。