【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】
如果类是一种确定的数据类型,那么模板就是一种对类的抽象。假设有这么一种类,它需要进行数据的计算,而且类型还很多,那么我们可能就要针对不同类型的数据定义不同的类。我们可以用下面一段代码说明问题:
上面的代码内容其实比较简单,大家可以看明白。第一个类是int_process,主要是整数的加、减、乘、除的计算。第二类是short_process,主要处理的短整数的加、减、乘、除计算。两个类处理的内容其实非常相似。那么有没有一种简单的办法可以同时处理这两个类?有!这就是模板。我们可以把具体的数据类型抽象出来,形成一种新的类模式。这就是模板类。下面的代码就是模板类:
我们看到类把具体的数据类型都抽象成了type。至此,不管是输入值、输出数值,我们都换成了type。至于类的名称,我们也从原来特定的数据类型计算,转变成了通用的data_process,当然这种名称的定义不是太重要的。那么模板类定义之后,我们应该怎么应用呢?大家继续看代码:
大家从上面的代码也看的出,模板类的定义并不复杂,只是在模板类的名称之后添加一下具体的数据类型就可以了。如果是int类型的,那么处理int的数据;同理,如果处理的是char或者是double类型数据,我们就可以按照char或者是double类型的数据进行计算,十分方便。当谈,处理的数据远远不止C++语言本身定义的char、double、float、int、short、long这几种数据类型,如果type本身就是一种class类型,同时这样class类型也支持+、-、*、/运算,那么本身也是可以用作模板的。我们这里介绍int、char、double只是为了简单地说明问题。看到类的声明后,我们不禁有一个疑问,既然模板类只有一个,那么这些模板类的构造函数、析构函数、成员函数的处理都相同吗?我们不妨看看看一看他们的汇编代码:
上面的代码有点长,我们大家来一起看一下:
60句: 定义int型的class类型,可以看到data_process<int>构造函数地址是0x401032
61句: 定义char型的class类型,看到data_process<char>构造函数地址是0x40103c
62句:定义double型的class类型,看到data_process<double>构造函数地址是0x401041
63句:调用data_process<int>的add成员函数,地址为0x40104b
64句:调用data_process<char>的add成员函数,地址为0x401055
65句:调用data_process<double>的add成员函数,地址为0x401050
上面的代码表明,其实编译器为我们函数中出现的每一个具体类实例化了一遍。针对每一个类型,模板的构造函数、析构函数、成员函数都要独立生成,这从上面的函数地址就可以看出来,没有什么神奇的。所以,我们明白了模板的本质就是对不同数据类型的相似性操作进行共同属性提取,合成模板。在应用的时候,编译器根据我们使用中的数据类型独立生成每一个类,构建每一个基本运算变量和运算函数,仅此而已。
模板注意事项:
(1)class上出现的问题在模板类上都会出现
(2)先把class写好,然后再转变成模板类
(3)如果不是数据类型的差异,而是共有数据数量上的差异,请选用继承代替模板
(4)模板中的type可以是自定义类型
(5)模板代码只能出现在头文件中,出现在*.cpp文件中没有意义,单独的*.cpp模板代码因为没有涉及具体类型,因此不会编译成任何二进制代码
(6)不同版本的vc对模板支持有差异,编译错误不一定是你自己的原因,但是绝大部分应该是你的原因
(7)模板生成的告警很冗长,一个warning或者是error 30~50行很正常,不要害怕,孰能生巧
【预告: 下面的博客介绍模板函数】
分享到:
相关推荐
用汇编的眼光看C++(之 总结篇)(pdf版本) 网络资源整理版本~~
当遇到较大较复杂的编程任务时,...2.《从汇编看C++ 之类成员》 3.《从汇编看C++ 之引用指针动态内存》 4.《从汇编看C++ 之虚函数接口多态》 欢迎大家下载,并到我微博上交流指正,我会继续努力(我微博上也叫小力庭)
C语言 指针
c++反汇编 c++反汇编的好教程c++反汇编 c++反汇编的好教程c++反汇编 c++反汇编的好教程
在Visual_C++中使用内联汇编 本文档主要详细介绍如何在c/c++代码内涵汇编代码,推荐给学习c/c++的同学们下载
工程主要时C++内联汇编的示例,内部简单的用汇编实现了函数传参及调用,循环以及if语句的实现
汇编和C++教程 ·数据传送类指令; ·算术运算类指令; ·逻辑运算类指令 ·控制程序转移类指令; ·位(布尔)处理类指令. 用机器码表示的指令格式以8位2进制数(字节)为基础。111条指令中单字节...
通过挖掘c++编译器源码,深入理解c++语言精粹,有助于深刻掌握c++语言精髓。
c++反汇编中文教程,国外大牛非常经典之作,教你如何用IDA逆向C++。
在 Visual C++ 中使用内联汇编
用汇编完成两个变量相加的独立子程序,编写C++调用汇编子程序,并将和显示在屏幕上
c++转汇编的小测试,c++转汇编的小测试c++。c++转汇编的小测试
很实用的王爽的汇编语言和王桂林老师的C++,很适用于初学者更好的从基础学起,这两本书很好
讲述如何在Visual C++中使用汇编语言。在C++中使用会变可以提高程序执行的速度和效率,在某些对实时性要求较高的应用场合非常有用。
是我们老师的一个课件 介绍如何把汇编语言和c++混合编程
C++汇编语言编写程序代码 C++汇编语言编写程序代码
动态创建、结构、 C++、汇编。病毒
汇编及C++混合编程开发Symbian程序示例
这文档是c/c++ 与ARM汇编的相互调用的规则