C++模板函数和模板类的诠释

TemPlate (模板)

一. 函数模板(Function Template)

在C++里,我们可以写一个通用函数,使用非实例化的参数类型,该参数在函数被调用时进行实例化。这种函数称为函数模板。

以前我们实现一个函数的时候都会为其写一个独自的方法去实现,就是把所有的代码都写在main函数里,没有任何封装和模块,这样的程序编写风格不是很好,没有充分的实现代码的复用。

eg:int iArray[max] = {10, 20, 30, 40, 50};
float fArray[max] = {1.1, 1.2, 1.3, 1.4, 1.5};
char *cArray[max] = {"one", "two", "three", "four","five"};
sx:
for(int i =0;i<max;i++){
    cout<<iArray[i]<<“ ”;
}
for(int i =0;i<max;i++){
    cout<<fArray[i]<<“ ”;
}
for(int i =0;i<max;i++){
    cout<<cArray[i]<<“ ”;
}

还有一种实现的是对代码的初步复用,就是写一个输出函数对数组进行输出;

void printArray(int* array,int size);
for(int i =0;i<max;i++){
    cout<<iArray[i]<<“ ”;
}
printArray(array,max);
void printArray(float* array,int size);
void printArray(char** array,int size);

我们可以看到这个输出函数的行为是一样的,只是操作的输出类型不同而已.

现在我们使用函数模板写一个通用的函数经行输出操作。

首先我们看一下普通函数和函数模板的区别:

1.普通函数:参数值未定,但参数类型确定.       2.函数模板:不仅参数的值不确定,连参数的类型也不确定,这是一种更高级的复用.

template<class T>  ———这就是函数模板的声明

T是类型参数,T是一个未实例化的类型.T有可能是int,float,char*....

void printArray(T* array,int size){
for(int i =0;i<size;i++){
cout<<array[i];
}
}

在调用函数模板时,对模板自动进行实例化,模板形参的类型取决于传入的实参的类型。

main:
    printArray(iArray,max);    //在这里T被实例化为int类型
    printArray(fArray,max);    //在这里T被实例化为float类型
    printArray(cArray,max);    //在这里T被实例化为char类型

总结:函数模板的作用就是把具有相同功能的函数写成一个模板,这样方便统一管理。

二.类模板 (class template)

通过函数模板我们可以看到,函数模板的参数是不同的;在这里我们可能想到我们以前接触到的许多类,这些类就是参数不同而已,在这里我们可以写一个基础类模板,当一个对象声明的时候,需要给出明确的类型。

函数模板:一个通用函数,可以操作多个类型。

类模板:仅仅是成员变量类型的不同,但是这些成员变量的操作(成员函数)类似.

类模板的声明和实现必须在.h文件中完成。

template <class T>,T是一个类型,未知类型

T* stackPtr;   //这里使用的是模板T声明成员函数; 在用int实例化后,可以视为类声明中所有的T用实例化的int类型来替换。

模板类的每个成员函数,都是模板函数; 实现时,每个成员函数前面,都要加上模板声明.

template<class T>
Stack<T>::Stack(int …)   //对类的构造函数进行初始化,

main:

与函数模板自动实例化不同,函数模板是在调用的时候进行实例化。 而类模板必须在声明该模板的对象时,明确的用指定类型对模板实例化。

//Stack<int> stack; //把模板T,实例化为int类型。

模板参数也可以有默认值。

template<class T = int>模板参数的默认值,即具体的数据类型。

模板参数可以有多个。

(1)template<class T,class S>;    (2)template<class T,int max_size>

T是参数化类型。max_size是非类型参数,已经确定类型的模板参数,非类型参数只能是整型,一般用于数组下标。

时间: 2024-10-10 04:02:17

C++模板函数和模板类的诠释的相关文章

C++ 模板函数与模板类

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

1.模板函数 // 定义 template <class T> Max(T &t1, T &t2) { return ((t1 > t2) ? t1 : t2); } //使用 Max(1, 2); Max(2.2, 3.3); 2.模板类 //定义 template <class T1, class T2> class myClass { private: T1 t1; T2 t2; public: myClass() {} myClass(T1 t1, T

gcc 关于模板函数或者模板类的问题

我把模板的声明写在X.h的文件里,把实现写在X.cpp的文件里 然后编译不通过,然人很恼火的是,根本不知道啥原因 在某网站上看到了一句 “又是一个模板分离编译的受害者” 立马就改正了,于是把两个文件写在了一起 没错了 然后搜了一下“模板分离” 有人说这是个传说 有人说这是真的 我也不深究这是啥了 听人讲这是老版本的编译器的错误 可现在都是2014年了啊 2014年11月25日20:21:59

模板函数

1.函数可以和类一样定义为模板函数. 模板函数与模板类最大的不同是:模板函数可以通过函数的参数确定模板类型. template<class T,int i> T&lookup(string<T> &s,const int n){......} string<float> s; int x=0; lookup(s,x);//这里自动识别到T就是float 类模板不会对参数进行推断的原因是一个类可以提供多个构造函数,在某些时候对模板类的参数进行推断是无法完成

函数模板与模板函数

1.函数指针--指针函数  函数指针的重点是指针.表示的是一个指针,它指向的是一个函数,例子: int   (*pf)(); 指针函数的重点是函数.表示的是一个函数,它的返回值是指针.例子: int*   fun(); 2.数组指针--指针数组  数组指针的重点是指针.表示的是一个指针,它指向的是一个数组,例子: int   (*pa)[8]; 指针数组的重点是数组.表示的是一个数组,它包含的元素是指针.例子; int*   ap[8]; 3.类模板--模板类(class   template-

[转]C++函数模板与模板函数

1.函数模板的声明和模板函数的生成 1.1函数模板的声明 函数模板可以用来创建一个通用的函数,以支持多种不同的形参,避免重载函数的函数体重复设计.它的最大特点是把函数使用的数据类型作为参数. 函数模板的声明形式为: template<typename 数据类型参数标识符> <返回类型><函数名>(参数表) {     函数体 } 其中,template是 定义模板函数的关键字:template后面的尖括号不能省略:typename(或class)是声明数据类型参数标识符

聊聊C++模板函数与非模板函数的重载

函数重载在C++中是一个很重要的特性.之所以有了它才有了操作符重载.iostream.函数子.函数适配器.智能指针等非常有用的东西. 平常在实际的应用中多半要么是模板函数与模板函数重载,或者是非模板函数与非模板重载.而让模板函数与非模板函数重载的情况却很少. 前几天在项目中偶然遇到了一个模板函数与非模板函数重载的诡异问题,大概相当于下面这种情况: 1 template <typename T> 2 int compare(const T& lhs, const T& rhs)