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 sum(double a,double b)
{//第二个function
return a+b;}
//这样我们就可以只用一个sum函数 就可以实现整数相加与小数相加。
//但是这样我们还是要定义两个函数。
//C++考虑了怎么避免这种重复的操作,代码如下: 函数模板的声明。
template <typename T>
T sum(T a,T b)
{return a+b;}
//只需要定义一个函数与只使用一个函数实现两数相加。
2.函数、结构体、类 模板的 定义样例:
//函数模板---使用体现:调用函数时传递的参数类型。
template<class 数据类型参数标识符>
<返回类型><函数名>(参数表)
{
函数体
} //结构体模板---使用体现:声明结构元素时 StackNode<类型> s;
template<class T>
struct StackNode
{
struct T data;
struct StackNode<T> *next;
}; //类模板---使用体现:声明类对象时 Stack<类型> s;
template<class T>
class Stack
{
public:
T pop();
bool push(T e);
private:
StackNode<T> *p;
}
template<class T>//类模板外的 成员函数实现
T Stack<T>::pop()
{...}
其中,template是定义模板函数的关键字;template后面的尖括号不能省略;class(或typename)是声明数据类型参数标识符的关键字,用以说明它后面的标识符是数据类型标识符。这样,在以后定义的这个函数中,凡希望根据实参数据类型来确定数据类型的变量,都可以用数据类型参数标识符来说明,从而使这个变量可以适应不同的数据类型。
3.● 模板的基本思想 ●●●●●●
①当你发现一套操作对多个不同类型的变量操作时。例.我们想实现链栈这个类,里面的元素可以是int char。
②实现的时候,那个链栈的头指针的类型就要为对应的 int节点、char节点...对应的指针类型。
③那就要复制粘贴 把int改成char 这样就有两个类 Stack_int Stack_char。
④用的时候当然没问题 但是整个类实现下来行数是很多的。当我们看着多出那么多行只是 int char 不同重复的代码,还容易写错。
⑤模板的就是在 类的定义前面和外部类成员函数实现代码 加上template<class T> ps.没有分号,只有T能改。
⑥接着就是把 int char 的地方 全部改成 T。。。类名换成Stack就可以
⑦这样就造出来了 Stack_int与Stack_char 的一个模板
⑧之前声明 对象的时候是{Stack_int a;Stack_char b;} 现在是{Stack<int> a;Stack<char> b;}
完美了!!!感觉模板只是把多个重复的代码化简成单个。。。。o.o。。。但确实好用。。。
4.使用中应该注意的问题:
①函数模板允许使用多个类型参数,但在template定义部分的每个形参前必须有关键字typename或class,即:
template<class 数据类型参数标识符1,…,class 数据类型参数标识符n>
<返回类型><函数名>(参数表)
{
函数体
}
②在template语句与函数模板定义语句<返回类型>之间不允许有别的语句。如下面的声明是错误的:
template<class T>
int I;
T min(T x,T y)
{
函数体
}
③模板函数类似于重载函数,但两者有很大区别:函数重载时,每个函数体内可以执行不同的动作,但同一个函数模板实例化后的模板函数都必须执行相同的动作。
④思在函数模板与模板函数调用之间 声明一个模板函数“类似”的函数,这参数会有一个隐式的转换!
5.学习性代码:
template <class T>//结构体模板
struct node
{
T data;
struct node<T> *lchild;
struct node<T> *rchild;
};
template <class T>//类内类模板
class bin
{
private:
node <T> h;
public:
void pri();
};
template <class T>//类外成员函数实现模板
void bin<T>::pri()
{
node<T> *p = new node;
cout<<"qunimade"<<endl;
}
int _tmain(int argc, _TCHAR* argv[])
{
bin<int> abc;
}
2017-03-11 19:16:23 -> 2017-03-22 22:51:24 -> 2017-03-26 22:33:26
C++模板学习:函数模板、结构体模板、类模板的更多相关文章
- C#学习笔记之结构体
1.概述 结构是一种与类相似的数据类型,不过它较类更为轻量,一般适用于表示类似Point.Rectangle.Color的对象.基本上结构能办到的类全都能办到,但在某些情况下使用结构更为合适,后面会有 ...
- 【AT91SAM3S】SAM3S-EK Demo工程中,LCD驱动程序的加载(函数指针结构体)
为了调试LCD,在英倍特的板子上烧Atmel的sam3s-ek_demo_1.4_source示例代码.LCD显示正常了,却找不到LCD的驱动究竟在哪. 花了好久,追踪到了这个执行过程. 进入main ...
- struct--------构造函数对结构体初始化的影响
struct--------构造函数对结构体初始化的影响. 没有构造函数时使用如下: struct ClassBook{ int number; int age; }; int main() { ...
- 【Unity Shader】---常用帮助函数、结构体和全局变量
[Unity Shader]---常用帮助函数.结构体和全局变量 一.内置包含文件 Unity中有类似于C++的包含文件.cginc,在编写Shader时我们可以使用#include指令把这些文件包含 ...
- <algorithm>里的sort函数对结构体排序
题目描述 每天第一个到机房的人要把门打开,最后一个离开的人要把门关好.现有一堆杂乱的机房签到.签离记录,请根据记录找出当天开门和关门的人. 输入描述: 每天的记录在第一行给出记录的条目数M (M &g ...
- 获取网络接口信息——ioctl()函数与结构体struct ifreq、 struct ifconf
转载请注明出处:windeal专栏 Linux 下 可以使用ioctl()函数 以及 结构体 struct ifreq 结构体struct ifconf来获取网络接口的各种信息. ioctl 首先看 ...
- 学习swift从青铜到王者之swift结构体和类08
定义 // 定义类 class StudentC{ } // 定义结构体 struct StudentS{ } 定义存储属性 // 定义类 class StudentC{ var name:Strin ...
- C语言笔记 08_函数指针&回调函数&字符串&结构体&位域
函数指针 函数指针是指向函数的指针变量. 通常我们说的指针变量是指向一个整型.字符型或数组等变量,而函数指针是指向函数. 函数指针可以像一般函数一样,用于调用函数.传递参数. 函数指针变量的声明: / ...
- Go基础3:函数、结构体、方法、接口
目录 1. 函数 1.1 函数返回值 同一种类型返回值 带变量名的返回值 函数中的参数传递 函数变量 1.2 匿名函数--没有函数名字的函数 在定义时调用匿名函数 将匿名函数赋值给变量 匿名函数用作回 ...
- 《PHP7底层设计与源码实现》学习笔记2——结构体对齐
书里给了一段代码,假如有个结构体如下: struct test { char a; int b; long c; void* d; int e; cha ...
随机推荐
- ng-class 用法
很长时间不写页面很多angualrjs的指令用法忘了,搜搜网上的千篇一律“不全”: 下面我把ngclass的用法列出来!(注:网上只有2种,我补充一种三维运算) 1: ng-class=" ...
- 【翻译】CSS水平和垂直居中的12种方法
英语原文链接 在CSS中有许多不同的方法能够做到水平和垂直居中,但很难去选择合适的那个.我会向你展示我所看到的所有的方法,帮助你在所面对的情境下选择最棒的那一个. 方法1 此方法将只能垂直居中单行文本 ...
- css——样式表分类,选择器
一,样式表分类 (1)内联样式[优先级最高][常用][代码重复使用性最差] (当特殊的样式需要应用到个别元素时,就可以使用内联样式. 使用内联样式的方法是在相关的标签中使用样式属性.样式属性可以包含任 ...
- vue组件递归
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 如何下载github项目中的部分文件(文件夹)
https://minhaskamal.github.io/DownGit/#/home 将你要下载的链接放进去即可.
- WPF+AE开发小结--TOCControl右键菜单删除图层
1.WPF项目中添加toccontrol控件,如何添加,网上有很多方法,可自行搜索,这里不再赘述,代码如下 <Window x:Class="AE.MainWindow" x ...
- XML配置文件的命名空间与Spring配置文件中的头
一直以来,写Spring配置文件,都是把其他配置文件的头拷贝过来,最多改改版本号,也不清楚哪些是需要的,到底是干嘛的.今天整理一下,拒绝再无脑copy. 一.Spring配置文件常见的配置头 < ...
- 数据库DQL操作(重点)
*****DQL -- 数据查询语言 查询不会修改数据库表记录!一. 基本查询//emp表名1. 字段(列)控制1) 查询所有列 SELECT * FROM 表名; SELECT * FROM em ...
- VB6/VBA中跟踪鼠标移出窗体控件事件(类模块成员函数指针CHooker类应用)
一.关于起因 前几天发了一篇博文,是关于获取VB类模块成员函数指针的内容(http://www.cnblogs.com/alexywt/p/5880993.html):今天我就发一下我的应用实例. V ...
- 老李分享:《Linux Shell脚本攻略》 要点(一)
老李分享:<Linux Shell脚本攻略> 要点(一) 第一章:Shell起步基础 1.变量:在bash中,每一个变量的值都是字符串.无论你给变量赋值时,有没有使用引号,值都会以字符 ...