1、模板的概念
我们已经学过重载(Overloading),对重载函数而言,C++的检查机制能通过函数参数的不同及所属类的不同。正确的调用重载函数。例如,为求两个数的最大值,我们定义MAX()函数需要对不同的数据类型分别定义不同重载(Overload)版本。
//函数1.
int max(int x,int y)
{ return(x>y)?x:y ; }
//函数2.
float max( float x,float y)
{ return (x>y)? x:y ; }
//函数3.
double max(double x,double y)
{ return (x>y)? x:y ; }
但如果在主函数中,我们分别定义了 char a,b; 那么在执行max(a,b);时 程序就会出错,因为我们没有定义char类型的重载版本。
现在,我们再重新审视上述的max()函数,它们都具有同样的功能,即求两个数的最大值,能否只写一套代码解决这个问题呢?这样就会避免因重载函数定义不 全面而带来的调用错误。为解决上述问题C++引入模板机制,模板定义:模板就是实现代码重用机制的一种工具,它可以实现类型参数化,即把类型定义为参数,从而实现了真正的代码可重用性。模版可以分为两类,一个是函数模版,另外一个是类模版。
2、 函数模板的写法
函数模板的一般形式如下:
Template <class或者也可以用typename T>
返回类型 函数名(形参表)
{//函数定义体 }
说明: template是一个声明模板的关键字,表示声明一个模板关键字class不能省略,如果类型形参多余一个 ,每个形参前都要加class <类型 形参表>可以包含基本数据类型可以包含类类型。
请看以下程序:
#include <iostream>
using std::cout;
using std::endl;
//声明一个函数模版,用来比较输入的两个相同数据类型的参数的大小,class也可以被typename代替,
//T可以被任何字母或者数字代替。
template <class T>
T min(T x,T y)
{
return(x<y)?x:y;
}
void main( )
{
int n1=2,n2=10;
double d1=1.5,d2=5.6;
cout<< "较小整数:"<<min(n1,n2)<<endl;
cout<< "较小实数:"<<min(d1,d2)<<endl;
system("pause");
}
程序运行结果:
1 、模板类和重载函数一起使用
两者一起使用时,先考虑重载函数,后考虑模板类,如过再找不到,就考虑类型转换,可能会带来精度的变化。
#include "iostream"
using namespace std ;
//函数模板
template <class T>
const T MAX(T a , T b)
{
printf("%s\n" , "template") ;
return (a > b) ? a : b ;
}
int MAX(int x , int y)
{
printf("%s\n" , "int int" );
return (x > y) ? x : y ;
}
int MAX(char x , int y)
{
printf("%s\n" , "char int" );
return (x > y) ? x : y ;
}
int MAX(int x , char y)
{
printf("%s\n" , "int char" );
return (x > y) ? x : y ;
}
int main(void)
{
int a = 3 , b = 5 ;
char x = 'x' ;
double c = 3.4 ;
cout<<MAX(a , b)<<endl ; //调用重载函数
cout<<MAX(c , b)<<endl ; //无对应的重载函数,则调用模板
cout<<MAX(a , x)<<endl ; //重载函数
cout<<MAX(x , a)<<endl ; //重载函数
cout<<MAX(c , a)<<endl ;
cout<<MAX(a) ;
system("pause") ;
return 0 ;
}
2、类模板
(1)类模板的具体格式
template <class T>
class A
{
}
在类定义体外定义的成员函数,应该使用函数模板。
/*
类模板,但是在类外定义成员函数的时候,需要使用函数模板
*/
#include <iostream>
using namespace std ;
template <class T>
class Base
{
public :
T a ;
Base(T b)
{
a = b ;
}
T getA(){ return a ;} //类内定义
void setA(T c);
};
template <class T> //模板在类外的定义
void Base<T>::setA(T c)
{
a = c ;
}
int main(void)
{
Base <int>b(4);
cout<<b.getA()<<endl;
Base <double> bc(4);
bc.setA(4.3);
cout<<bc.getA()<<endl;
system("pause");
return 0 ;
}
注意成员函数在类外定义的情况。
3 、模板类
主要指的是 STL 模板类
分享到:
相关推荐
有助于你深入地学习,理解c++类模板相关技术。由简单到复杂逐渐深入学习。
C++模板学习记录 模板定义 模板使用 类模板 函数模板 特化模板 编译器
自己封装的一个queue, 与大家分享和学习下。
由清华大学大牛写成的C++模板类,值得学习借鉴。链表可能是一种相对比较难于掌握的数据结构,或许这个文件能够帮助你更好地理解和使用链表。希望能够对你有所帮助。
使用C++实现的AVLTree自平衡二叉树,支持动态插入与删除操作,供C++数据结构课程学习与交流使用。
练习 C++中函数模板、类模板的创建和使用方法。 (1) 理解模板的作用。 (2) 学习函数模板及其声明方法,掌握模板函数及其生成方法。 (3) 学习函数模板的两种不同的实例化方法。 (4) 学习类模板的声明与使用方法。
在自学C++的时候写的代码,个人感觉值得刚刚开始学C++的开发者看看,大神们看了求指教哪里写的不好,好让我更好的学习
这是我用c++语言编写的一个模板类,主要封装了各种排序方法(直接插入、二分插入、简单交换、冒泡、简单选择、快速排序、归并排序、堆排序),并能统计所用时间以及排序所用的交换次数、比较次数,在Visual stidio ...
该代码使用C++编写,用户可以使用vs环境编译运行,源码可查看.cpp文件。 该段代码包含对数组的增删查以及排序的函数,...本代码适用于初学面向对象编程,学习C++中类或类模板的学习者。希望该实例可以对大家有所帮助。
描述C++的模板类,介绍使用方式,对于初学者来说是比不可少的学习资源
用c++模版实现的stack类,供初学者学习。 template ,int N> class Stack { public: Stack(); ~Stack(); void push(T t); T pop(); bool isEmpty(); private: T *m_pT; const int m_maxSize; ...
C++的学习感想 很多人把学习C++语言当成学习VC了,我曾经就...C++语言相对于C语言来说引入了两个大的新东西,一个就是面向对像(具体来将就是类),另外就是模板技术(模板编程或者叫泛型编程是进来非常流行的技术
我们已经学过重载(Overloading),对重载函数而言,C++的检查机制能通过函数参数的不同及所属类的不同。正确的调用重载函数。例如,为求两个数的最大值,我们定义MAX()函数需要对不同的数据类型分别定义不同重载...
为什么使用模板? 在算法相同,参数类型不同时简化函数重载功能,同样,类模板可以用不同类型 数据创建具有相同类结构的对象
P167~184C++类和函数模板学习笔记.docx
C++ 表达式求值,运用类模板技术,自己写的栈类Stack,运算符优先级等,希望大家有兴趣下载用! 对学习数据结构的很有用哦!!
本书作者根据自己学习C++的亲身体会及多年教学经验,用简单的例子和简练的叙述讲解C++编程,别具特色。 全书共分十八章,内容涉及对象的演化、数据抽象、隐藏实现、初始化与清除、函数重载与缺省参数、输入输出流...
这是我大一上学期刚学完C语言后,开始学习C++,开始接触...在学习C++过程中,加深了我对编程的理解,比如python为什么很多方法可以对不同的数据类型进行操作,同时模板类,泛型编程帮助我可以自己完成一个库的实现。
编程语言:C++ 实现功能:自定义实现的Vector类 参考方向:C++泛化模板编程 C++初学者参考学习
主要介绍了C++ 类模板、函数模板全特化、偏特化的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧