一、c++中模板是什么?

首先:

 int Max(int x, int y)
{
return x > y ? x : y;
} float Max(float a,float b)
{
return a > b ? a : b;
}

通常我们想要比较不同数据类型的时候不得不定义两种不同的函数来表示区分,为了能精简代码和避免强类型的严格性和灵活性的冲突,我们就需要用到模板去改善这种情况。

二、为什么要定义模板?

强类型程序设计中,参与运算的所有对象的类型在编译时即确定下来,并且编译程序将进行严格的类型检查。为了解决强类型的严格性和灵活性的冲突。有以下3种方式解决:

1)带参数宏定义(原样替换)

2)重载函数(函数名相同,函数参数不同)

3)模板(将数据类型作为参数)

模板的使用中函数模板类模板用的最广最繁。

函数模板

定义:

template <模板参数表>

返回类型 函数名 (参数列表)

{

  //函数体

}

注:class或typename修饰的类型参数,代表一种类型;非类型参数表达式,可以是int,long,long long类型,使用已知类型符,代表一个常量

 //1.函数模版的隐式实例化
#include <iostream>
using namespace std; template <class T>
T Max(T x, T y); //函数模版的申明 int main()
{
int intX = , intY = ;
double dblX = 3.9, dblY = 2.9;
cout << Max(intX, intY) << endl; //实参为int型,生成int型模板函数,并对第二个参数进行检查
//或者cout << Max<int>(intX, intY) << endl;
cout << Max(dblX, dblY) << endl; //实参为double型,生成double型模板函数,并对第二个参数进行检查
//或者cout << Max<double>(dblX, dblY) << endl;
cout << Max(dblY,intX) << endl; //模板函数做不到两个参数类型不一致还可以比较 return ;
} template <class T>
T Max(T x, T y) //函数模版的实现
{
return (x > y ? x : y);
}
 //2.函数模板和函数模板的重载
#include <iostream>
using namespace std; template < class T >
T Max(T x, T y); template <class T>
T Max(T x, T y, T z)
{
return x > y ? (x > z ? x : z) : (y > z ? y : z);
} int main()
{
int intX = , intY = , intZ = ;
double dblX = 3.0, dblY = 2.9; cout << Max<int>(intX, intY) << endl; //调用实例化的Max(int,int)
cout << Max<int>(intX, intY, intZ) << endl; //调用实例化的Max(int,int,int)
cout << Max<double>(dblX, dblY) << endl; //显示实例化为double型,生成double型模板函数
cout << Max('A', '') << endl; //隐式实例化char型,生成char型模板函数
return ;
} template <class T>
T Max(T x, T y)
{
return x > y ? x : y;
}

类模板

定义:

template<模板参数表>

class 类名

{

}

下面给出一个栈的模板实现类:

 #include <iostream>
using namespace std; #define MaxSize 10 template <class T>
class CStack
{
private:
T data[MaxSize];
int top;
public:
CStack():top(-)
{
}
void Push(void);
void Pop(void);
bool ifEmpty()
{
if(top == -)
return true;
else
return false;
}
bool ifFull()
{
if(top == MaxSize-)
return true;
else
return false;
}
T getTop(void)
{
if(ifEmpty())
{
cout<<"栈为空,不能取栈顶!"<<endl;
return -;
}
return this->data[top];
}
}; template <class T>
void CStack<T>::Push(void)
{
if(ifFull())
{
cout<<"栈已满,不能入栈!"<<endl;
return ;
}
T a;
cin>>a;
this->data[++top] = a;
cout<<"元素"<<a<<"入栈!"<<endl;
} template <class T>
void CStack<T>::Pop(void)
{
if(ifEmpty())
{
cout<<"栈为空,不能出栈!"<<endl;
return ;
}
T temp = this->data[top--];
cout<<"元素"<<temp<<"出栈!"<<endl;
} int main()
{
CStack<int> s1; //可以自己更换数据类型int
int i;
do
{
cout<<"\t===============================\n";
cout<<"\t*********顺序栈类模板**********\n";
cout<<"\t 1.入栈 \n";
cout<<"\t 2.出栈 \n";
cout<<"\t 3.取栈顶 \n";
cout<<"\t 0.退出 \n";
cout<<"\t*******************************\n";
cout<<"\t===============================\n";
do
{
cout<<"\tplease input your operator:";
cin>>i;
system("cls");
}while(i!= && i!= && i!= && i!=);
switch(i)
{
case :
s1.Push();
system("pause");
system("cls");
break;
case :
s1.Pop();
system("pause");
system("cls");
break;
case :
if(- == s1.getTop())
{
system("pause");
system("cls");
break;
}
else
cout<<"栈顶元素为:"<<s1.getTop()<<endl;
system("pause");
system("cls");
break;
}
}while(i != );
}

c++中模板是什么?为什么要定义模板?的更多相关文章

  1. template 不能分别在.h和.cpp中定义模板

    先上代码: #ifndef SEQLIST_H #define SEQLIST_H #include <iostream> ; template <typename type> ...

  2. WPF中通过代码定义模板

    WPF中可以再XAML中定义模板,也可以通过C#代码定义模板,通过代码可能更清楚的看清其逻辑,而且代码的好处就是可以随时动态的去操作,而在XAML中定义的一般都是静态的. //控件呈现的显示内容1(这 ...

  3. C++-函数模板特化如何避免重复定义

     我正在用一个基于模板的库源代码,该库包含一些针对特定类型的模板函数特化.类模板,函数模板和模板函数特化都在头文件中.我在我的.cpp文件中 #include 头文件并编译链接工程.但是为了在整个工程 ...

  4. 关于对ProgressBar定义模板的一些总结

    在之前的博客中曾经写到了一篇关于如何定义圆形进度条的文章,今天就ProgressBar再来进行一些总结,首先来介绍一下ProgressBar的结构,ProgressBar控件的模板有两个部分,我们在定 ...

  5. C++ 实验2:函数重载、函数模板、简单类的定义和实现

    1.函数重载编程 编写重载函数add(),实现对int型,double型,Complex型数据的加法.在main()函数中定义不同类型数据,调用测试. #include <iostream> ...

  6. 实际上ECMAScript中并没有对类的定义

    首先,我们用一个经典例子来简单阐述一下ECMAScript中的继承机制. 在几何学上,实质上几何形状只有两种,即椭圆形(是圆形的)和多边形(具有一定数量的边).圆是椭圆的一种,它只有一个焦点.三角形. ...

  7. django中将views.py中的python方法传递给html模板文件

    常规的模板渲染 from django.db import models # Create your models here. class ArticalType(models.Model): cap ...

  8. 4 Template层 -定义模板

    1.模板介绍 作为Web框架,Django提供了模板,可以很便利的动态生成HTML 模版系统致力于表达外观,而不是程序逻辑 模板的设计实现了业务逻辑(view)与显示内容(template)的分离,一 ...

  9. 使用x-template 定义模板

    demo <script type="text/x-template" id="myFirstScriptComponent"> <p> ...

随机推荐

  1. Attempt to invoke interface method 'boolean java.util.List.add(java.lang.Object)' on a null object reference

    尝试在一个空的对象引用上引用boolean java.util.List.add()这个方法: 错误例子: private ArrayList<String> classList; cla ...

  2. Micropython TurnipBit 青少年入门编程 交通灯实验

    不知道大家小时候对红绿灯的原理有什么研究过,我是农村的孩子直到初中才见到真实的红绿灯,当时我记得很清楚,在那个路口站了五六分钟就盯着红绿灯变换,搞不清原理,只觉得神奇.现在想来实在可笑,今天写这个的很 ...

  3. 从AngularJS2谈到前台开发工程化

    才刚刚对AngularJS有些了解,又听闻AngularJS2早就铺天盖地了,AngularJS3刚刚夭折,AngularJS4今年已经发布了,还是学习先下AngularJS2吧,据说更加适合以移动为 ...

  4. 从头编写asp.net core 2.0 web api 基础框架 (5) + 使用Identity Server 4建立Authorization Server (7) 可运行前后台源码

    前台使用angular 5, 后台是asp.net core 2.0 web api + identity server 4. 从头编写asp.net core 2.0 web api 基础框架: 第 ...

  5. nicEditors使用方法

    //声明初始化富文本框到context中 <div> <textarea id="context" name="context" style= ...

  6. 使用MBROSTool 工具制作U盘多启动盘的方法总结

    前段时间写了一个自用五合一多启动盘分享--分别用来维护娱乐,wifi密码破解,win&mac登陆密码绕过/清除,反馈的同学还是挺多,觉得大家都有这方面的需求,于是再把自己的使用经验总结一下. ...

  7. 关于Sql server数据 MD5加密

    最近在写一个web项目时,需要在数据库中将用户密码等一类信息进行加密处理.数据加密算法有许多  ,各有各的优缺点;在  http://www.cnblogs.com/yangywyangyw/arch ...

  8. New Windows 10 SDK - Multi-instance UWP apps

    概述 前面一篇 About Windows 10 SDK Preview Build 17110 中,我们简单介绍了 Multi-instance UWP Apps,今天结合开发过程详细讲解一下. 在 ...

  9. npm包使用语义化版本号

    npm 采用语义版本管理软件包.所谓语义版本,就是指版本号为a.b.c的形式,其中a是大版本号,b是小版本号,c是补丁号. 一个软件发布的时候,默认就是1.0.0版.如果以后发布补丁,就增加最后一位数 ...

  10. vue Echarts 柱状图点击事件

    drawBar(){ let that = this; let chart = this.$echarts.init(document.getElementById('bar-graph')); le ...