函数模板和类模板

一、函数模板

函数模板代表一类相同结构的函数,通过用户提供的具体参数,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 }

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

执行结果为:

时间: 2024-12-28 18:33:10

函数模板和类模板的相关文章

函数模板与类模板

函数模板,顾名思义,是在生成函数时依照的模板. 有时,我们需要对不同的数据类型做同样的函数操作. 比如:分别对一个int类型数 和 一个double类型数求平方. 这时,虽然都是同样的求平方操作(函数体内代码一样),但是我们必须要编写两个不同的函数,因为处理int类型的函数的参数和返回值类型都应该是int,而处理double类型的函数的参数和返回值都应该是double. 如下:函数体内操作代码一样,设计为重载函数,用相同的函数名,但是参数类型和返回值类型却都不一样,函数需要定义两次. int S

C++学习之模板 ----函数模板、类模板

本博文主要讨论函数模板与类模板以及其简单应用. 1).作用:函数模板和类模板都可以看做是一种代码产生器,往里面放入具体的类型,得到具体化的函数或者class. 2).编译(分为两步): a):实例化之前,先检查模板本身语法是否正确: b):根据 函数调用或者类模板调用 ,先去实例化模板代码,产生具体的函数/类. 也就是说, 没有函数调用或者类类型对象声明,就不会实例化模板代码,在目标文件obj中找不到模板的痕迹. 3):优缺点 模板的缺点是代码膨胀,编译速度慢,而优点是运行速度快. 一.函数模板

C++笔记(7):泛型编程和模板(函数模板和类模板)

泛型编程和模板 0.泛型编程 1.函数模板 2.类模板 ----------------------------------------------------------------------------------------------------------- 0.泛型编程 所谓泛型就是以独立于任何特定类型的方式编写代码.前面介绍的标准库的容器.迭代器和算法都是泛型编程的具体应用. 模板是泛型编程的基础.使用模板的时候不需要知道模板是如何定义的,但今天我们来介绍如何定义自己的模板类和模

【C/C++学院】0825-类模板/final_override/类模板与普通类的派生类模板虚函数抽象模板类/类模板友元/位运算算法以及类声明/Rtti 实时类型检测/高级new创建/类以及函数包装器

类模板 类模板多个类型默认类型简单数组模板 #pragma once template <class T=int>//类模板可以有一个默认的值 class myArray { public: myArray(); ~myArray(); }; #include "myArray.h" template <class T=int>//每一个函数都需要加上一个默认的值 myArray<T>::myArray() //类模板成员函数在外部,需要加载类型初始

C++模板(类模板、函数模板)

1.在c++Template中很多地方都用到了typename与class这两个关键字,而且好像可以替换,是不是这两个关键字完全一样呢? 答:class用于定义类,在模板引入c++后,最初定义模板的方法为:template<class T>,这里class关键字表明T是一个类型,后来为了避免class在这两个地方的使用可能给人带来混淆,所以引入了typename这个关键字,它的作用同class一样表明后面的符号为一个类型,这样在定义模板的时候就可以使用下面的方式了:      template

类模板,多种类型的类模板,自定义类模板,类模板的默认类型,数组的模板实现,友元和类模板,友元函数,类模板与静态变量,类模板与普通类之间互相继承,类模板作为模板参数,类嵌套,类模板嵌套,类包装器

 1.第一个最简单的类模板案例 #include "mainwindow.h" #include <QApplication> #include <QPushButton> #include <QLabel> template<class T> class run { public: T w; void show() { w.show(); } void settext() { w.setText("A"); }

C++解析(26):函数模板与类模板

0.目录 1.函数模板 1.1 函数模板与泛型编程 1.2 多参数函数模板 1.3 函数重载遇上函数模板 2.类模板 2.1 类模板 2.2 多参数类模板与特化 2.3 特化的深度分析 3.小结 1.函数模板 1.1 函数模板与泛型编程 C++中有几种交换变量的方法? 交换变量的方法--定义宏代码块 vs 定义函数: 定义宏代码块 优点:代码复用,适合所有的类型 缺点:编译器不知道宏的存在,缺少类型检查 定义函数 优点:真正的函数调用,编译器对类型进行检查 缺点:根据类型重复定义函数,无法代码复

C++模板学习:函数模板、结构体模板、类模板

C++模板:函数.结构体.类 模板实现 1.前言:(知道有模板这回事的童鞋请忽视) 普通函数.函数重载.模板函数 认识. //学过c的童鞋们一定都写过函数sum吧,当时是这样写的: int sum(int a,int b) { return a+b; } //实现了整数的相加 //如果再想同时实现小数的相加,就再多写个小数的相加.普通实现我就不写了,知道函数重载的童鞋们会这样写: int sum(int a,int b) {//第一个function return a+b;} double su

C++--模板的概念和意义、深入理解函数模板、类模板的概念和意义

一.模板的概念与意义 Q:C++中有几种交换变量的方法?定义宏代码与定义函数A.定义宏代码优点:代码复用,适合所有的类型缺点:编译器不知道宏的存在,缺少类型检查B.定义函数优点:真正的函数调用,编译器对类型进行检查缺点:根据类型重复定义函数,无法代码复用 C.泛型编程--不考虑具体数据类型的编程方式Swap泛型写法中的T不是一个具体的数据类型,而是泛指任意的数据类型C++中的泛型编程函数模板--一种特殊的函数可用不同类型进行调用,看起来和普通函数很相似,区别是类型可被参数化函数模板的语法规则1.