`
java-mans
  • 浏览: 11388484 次
文章分类
社区版块
存档分类
最新评论

c++模板类学习

 
阅读更多

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++类模板相关技术。由简单到复杂逐渐深入学习。

    c++模板学习记录(自己)

    C++模板学习记录 模板定义 模板使用 类模板 函数模板 特化模板 编译器

    C++ queue 类模板

    自己封装的一个queue, 与大家分享和学习下。

    C++ 链表类模板 清华大牛精心编写

    由清华大学大牛写成的C++模板类,值得学习借鉴。链表可能是一种相对比较难于掌握的数据结构,或许这个文件能够帮助你更好地理解和使用链表。希望能够对你有所帮助。

    AVLTree自平衡二叉树C++模板类实现

    使用C++实现的AVLTree自平衡二叉树,支持动态插入与删除操作,供C++数据结构课程学习与交流使用。

    c++函数模板和类模板计实验报告

    练习 C++中函数模板、类模板的创建和使用方法。 (1) 理解模板的作用。 (2) 学习函数模板及其声明方法,掌握模板函数及其生成方法。 (3) 学习函数模板的两种不同的实例化方法。 (4) 学习类模板的声明与使用方法。

    C++类模板&&容器&&重载

    在自学C++的时候写的代码,个人感觉值得刚刚开始学C++的开发者看看,大神们看了求指教哪里写的不好,好让我更好的学习

    用c++语言编写的一个模板类(8种排序方法)

    这是我用c++语言编写的一个模板类,主要封装了各种排序方法(直接插入、二分插入、简单交换、冒泡、简单选择、快速排序、归并排序、堆排序),并能统计所用时间以及排序所用的交换次数、比较次数,在Visual stidio ...

    C++类模板实现数组的排序以及增删查

    该代码使用C++编写,用户可以使用vs环境编译运行,源码可查看.cpp文件。 该段代码包含对数组的增删查以及排序的函数,...本代码适用于初学面向对象编程,学习C++中类或类模板的学习者。希望该实例可以对大家有所帮助。

    C++函数模板及实现原理

    描述C++的模板类,介绍使用方式,对于初学者来说是比不可少的学习资源

    用c++模版实现的stack类

    用c++模版实现的stack类,供初学者学习。 template ,int N&gt; class Stack { public: Stack(); ~Stack(); void push(T t); T pop(); bool isEmpty(); private: T *m_pT; const int m_maxSize; ...

    C++的学习感想

    C++的学习感想 很多人把学习C++语言当成学习VC了,我曾经就...C++语言相对于C语言来说引入了两个大的新东西,一个就是面向对像(具体来将就是类),另外就是模板技术(模板编程或者叫泛型编程是进来非常流行的技术

    C++模板学习\模板的概念\函数模板的写法

    我们已经学过重载(Overloading),对重载函数而言,C++的检查机制能通过函数参数的不同及所属类的不同。正确的调用重载函数。例如,为求两个数的最大值,我们定义MAX()函数需要对不同的数据类型分别定义不同重载...

    学习C++的函数模板和类模板

    为什么使用模板? 在算法相同,参数类型不同时简化函数重载功能,同样,类模板可以用不同类型 数据创建具有相同类结构的对象

    P167~184C++类和函数模板学习笔记.docx

    P167~184C++类和函数模板学习笔记.docx

    C++ 表达式求值(采用类模板写的)

    C++ 表达式求值,运用类模板技术,自己写的栈类Stack,运算符优先级等,希望大家有兴趣下载用! 对学习数据结构的很有用哦!!

    c++编程学习及快速入门

    本书作者根据自己学习C++的亲身体会及多年教学经验,用简单的例子和简练的叙述讲解C++编程,别具特色。 全书共分十八章,内容涉及对象的演化、数据抽象、隐藏实现、初始化与清除、函数重载与缺省参数、输入输出流...

    C++从初识到模板类-大一,面向对象编程

    这是我大一上学期刚学完C语言后,开始学习C++,开始接触...在学习C++过程中,加深了我对编程的理解,比如python为什么很多方法可以对不同的数据类型进行操作,同时模板类,泛型编程帮助我可以自己完成一个库的实现。

    C++ 实现的Vector 类

    编程语言:C++ 实现功能:自定义实现的Vector类 参考方向:C++泛化模板编程 C++初学者参考学习

    C++ 类模板、函数模板全特化、偏特化的使用

    主要介绍了C++ 类模板、函数模板全特化、偏特化的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

Global site tag (gtag.js) - Google Analytics