c++中模板是什么?为什么要定义模板?
一、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++中模板是什么?为什么要定义模板?的更多相关文章
- template 不能分别在.h和.cpp中定义模板
先上代码: #ifndef SEQLIST_H #define SEQLIST_H #include <iostream> ; template <typename type> ...
- WPF中通过代码定义模板
WPF中可以再XAML中定义模板,也可以通过C#代码定义模板,通过代码可能更清楚的看清其逻辑,而且代码的好处就是可以随时动态的去操作,而在XAML中定义的一般都是静态的. //控件呈现的显示内容1(这 ...
- C++-函数模板特化如何避免重复定义
我正在用一个基于模板的库源代码,该库包含一些针对特定类型的模板函数特化.类模板,函数模板和模板函数特化都在头文件中.我在我的.cpp文件中 #include 头文件并编译链接工程.但是为了在整个工程 ...
- 关于对ProgressBar定义模板的一些总结
在之前的博客中曾经写到了一篇关于如何定义圆形进度条的文章,今天就ProgressBar再来进行一些总结,首先来介绍一下ProgressBar的结构,ProgressBar控件的模板有两个部分,我们在定 ...
- C++ 实验2:函数重载、函数模板、简单类的定义和实现
1.函数重载编程 编写重载函数add(),实现对int型,double型,Complex型数据的加法.在main()函数中定义不同类型数据,调用测试. #include <iostream> ...
- 实际上ECMAScript中并没有对类的定义
首先,我们用一个经典例子来简单阐述一下ECMAScript中的继承机制. 在几何学上,实质上几何形状只有两种,即椭圆形(是圆形的)和多边形(具有一定数量的边).圆是椭圆的一种,它只有一个焦点.三角形. ...
- django中将views.py中的python方法传递给html模板文件
常规的模板渲染 from django.db import models # Create your models here. class ArticalType(models.Model): cap ...
- 4 Template层 -定义模板
1.模板介绍 作为Web框架,Django提供了模板,可以很便利的动态生成HTML 模版系统致力于表达外观,而不是程序逻辑 模板的设计实现了业务逻辑(view)与显示内容(template)的分离,一 ...
- 使用x-template 定义模板
demo <script type="text/x-template" id="myFirstScriptComponent"> <p> ...
随机推荐
- 作为一个懒虫,如何优雅的使用windows
懒虫windows系列(一) 首先是快捷键,因为自己太懒了,觉得用鼠标很麻烦,下面总结一下自己最常用的快捷键(windows10 ) Ctrl+Shift+N:新建文件夹 F2:重命名 Ctrl + ...
- JDK1.8源码(二)——java.lang.Integer 类
上一篇博客我们介绍了 java.lang 包下的 Object 类,那么本篇博客接着介绍该包下的另一个类 Integer.在前面 浅谈 Integer 类 博客中我们主要介绍了 Integer 类 和 ...
- 深入浅出Java分布式系统通信
对java分布式系统通信的理解: 1.集群模式,将相同应用模块部署多份 2.业务拆分模式,将业务拆分成多个模块,并分别部署 3.存储分布式 由于分布式概念太大,我们可以缩小下讨论的范围. 以下分布式的 ...
- c++函数常用
isalnum 判断一个字符是否是字符类的数字或字母isalpha 判断一个字符是否是字母isblank 判断一个字符是否是空白字符(空格,水平制表符,TAB)iscntrl 判断一个控制符(ASCI ...
- 发个2012年用java写的一个控制台小游戏
时间是把杀狗刀 突然发现了12年用java写的控制台玩的一个文字游戏,有兴趣的可以下载试试哈汪~ 里面难点当时确实遇到过,在计算倒计时的时候用了多线程,当时还写了好久才搞定.很怀念那个时间虽然不会做游 ...
- iOS加密算法总结
常用加密算法: DES:Data Encryption Standard,即数据加密算法,它是IBM公司于1975年研究成功并公开发表的. DES(数据加密标准)原理: DES是一个分组加密算法,它以 ...
- windows下安装mysql以及启动
配置环境变量,在path中添加 ;E:\wamp\Apache24\mysql(这是你的mysql安装路径),然后在修改一下配置文件my-default.ini(mysql安装文件夹目录下) 修改其中 ...
- Angular组件——父子组件通讯
Angular组件间通讯 组件树,1号是根组件AppComponent. 组件之间松耦合,组件之间知道的越少越好. 组件4里面点击按钮,触发组件5的初始化逻辑. 传统做法:在按钮4的点击事件里调用组件 ...
- react+redux+webpack+git技术栈
一.git bash here mdkr cnpm init -y ls -a ls -l ls -la隐藏的也可查看 cat package.json 二.npm npm i webpack-dev ...
- 【Python】 用户图形界面GUI wxpython I 基本用法和组件
wxpython - 基本用法和组件 wxpython是python对跨平台GUI库wxWidgets的封装.wxWidgets是由C++写成的. wxpython被包装进了wx模块中,用它设计GUI ...