码迷,mamicode.com
首页 > 其他好文 > 详细

函数模板和类模板

时间:2015-12-25 13:08:30      阅读:151      评论:0      收藏:0      [点我收藏+]

标签:

一、函数模板

函数模板代表一类相同结构的函数,通过用户提供的具体参数,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>b ? a:b;
 9 }
10 
11 int main(int argc,char* argv[])
12 {
13     cout<<max1(1,2)<<endl;                //隐式调用int类型的max1()函数
14     cout<<max1(5.6f,3.1f)<<endl;        //隐式调用float类型的max1()函数
15     cout<<max1(3.14l,5.13l)<<endl;        //隐式调用double类型的max1()函数
16     cout<<max1(A,C)<<endl;            //隐式调用char类型的max1()函数
17     cout<<max1<int>(3,5.7f)<<endl;        //必须指定int类型
18     system("pause");
19     return 0;
20 }

执行结果:

技术分享

分析:值得注意的是代码第17行,由于第一个参数3是int型,而第二个参数5.7是float型,此时如果不指定使用什么类型,会产生编译的模糊性,即编译器不知道需要调用int类型还是float类型的max1函数。

 

二、类模板

类模板就是为类声明一种模板,使得类中的某些数据成员,或某些成员函数的参数,又或者是某些成员函数的返回值可以取任意的数据类型,包括基本数据类型和自定义数据类型。

 1 #include "stdafx.h"
 2 #include <iostream>
 3 using namespace std;
 4 
 5 struct Student
 6 {
 7     int id;
 8     float average;
 9 };
10 
11 //类模板
12 template <class T>
13 class Store
14 {
15 public:
16     Store(void);        //默认构造函数
17     T GetElem(void);    //获取
18     void PutElem(T x);    //设定
19 private:
20     T item;
21     int haveValue;
22 };
23 
24 //成员函数实现,类模板的成员函数都是函数模板
25 template <class T>
26 Store<T>::Store(void):haveValue(0)
27 {
28 }
29 
30 template <class T>
31 T Store<T>::GetElem(void)
32 {
33     if(haveValue == 0)
34     {
35         cout<<"item没有存入数据!"<<endl;
36         exit(1);
37     }
38     return item;
39 }
40 
41 template <class T>
42 void Store<T>::PutElem(T x)
43 {
44     haveValue = 1;
45     item = x;
46 }
47 
48 int main(int argc, char* argv[])
49 {
50     Student g = {103,93.8};
51     Store<int> S1,S2;    //声明两个Store类对象,数据成员item为int型
52     Store<Student> S3;    //声明Store类对象,数据成员item为Student结构体类型
53     S1.PutElem(7);
54     S2.PutElem(-8);
55     S3.PutElem(g);
56     cout<<S1.GetElem()<<endl;
57     cout<<S2.GetElem()<<endl;
58     cout<<"ID is "<<S3.GetElem().id<<endl;
59     cout<<"Average is "<<S3.GetElem().average<<endl;
60     system("pause");
61     return 0;
62 }

以上这个例子比较简单直观地描述了类模板的定义及使用。

执行结果为:

技术分享

 

函数模板和类模板

标签:

原文地址:http://www.cnblogs.com/may1016/p/5073584.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!