C++学习笔记34 模版的原理

模版在C++中具有非常重要的地位,STL就是大量运用模版写出来的。

模版的优点我就不一一列举了。这里我只说一下模版的原理。

当编译器遇到模版方法定义的时候,编译器进行语法检查,但是并不会编译模版。编译器无法编译模版定义,因为编译器不知道要使用的类型是什么,编译器不知道x和y的类型的情况下无法为x=y这样的语句生成代码。

当编译器遇到一个实例化的模版的时候,例如vector<int> vi(这里我只是拿vector举例,实际上基本类型的vector代码好像会自动存在编译器中),编译器会将模版类定义中的每一个T替换为int,从而生成vector的int版本。当模版遇到这个模版的另一个实例的时候,例如vector<string>,就会生成相应的string版本代码。

1.选择性实例化。

编译器只会为那些实际为某个类型调用的类方法生成代码。

#include <iostream>
using namespace std;
template<class T>
class test{
private:
	T data;
public:
	test(T d):data(d){
	}
	void show()const{
		cout<<"this data is "<<data<<endl;
	}

};
int main()
{
	test<int> ti(15);
	ti.show();
	test<string> ts("string");
	ts.show();

}

例如上面的例子编译器只会生成test的int以及string版本,其他的如double,char等版本则不会生成。

C++学习笔记34 模版的原理

时间: 2024-11-25 06:49:15

C++学习笔记34 模版的原理的相关文章

C++学习笔记36 模版的显式具体化和显式实例化

C++的模版有时候很可能无法处理某些类型. 例如: #include <iostream> using namespace std; class man{ private: string name; int data; public: man(string s,int i):name(s),data(i){ } void show()const{ cout<<"this name is "<<name<<" ,data=&quo

Java IO学习笔记:概念与原理

Java IO学习笔记:概念与原理 一.概念 Java中对文件的操作是以流的方式进行的.流是Java内存中的一组有序数据序列.Java将数据从源(文件.内存.键盘.网络)读入到内存 中,形成了流,然后将这些流还可以写到另外的目的地(文件.内存.控制台.网络),之所以称为流,是因为这个数据序列在不同时刻所操作的是源的不同部分. 二.分类 流的分类,Java的流分类比较丰富,刚接触的人看了后会感觉很晕.流分类的方式很多: 1.按照输入的方向分,输入流和输出流,输入输出的参照对象是Java程序. 2.

[原创]java WEB学习笔记34:Session 案例 之 解决表单重复提交

本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 ---------------------------------

HCNP学习笔记之OSPF协议原理及配置9-基础知识特殊区域

为了减少外部路由对内部路由器的影响,可以通过设置特殊区域减少路由的数量. 因为对于内部路由不需要知道外部路由的明细. 即特殊区域是为了减少LSDB的规模. 1 stub区域,过滤了4类,5类 LSA,以一条到外部网络的默认路由替代. stub 区域实例: 由路由表可以看出,区域间路由(3类 network-summary-LSA)可以通告到stub中. 5类as-external-LSA被过滤,外部路由被转换成一条默认路由. 2 完全stub区域,过滤了3,4,5类LSA,拓扑和上例相同. 3

Android(java)学习笔记95:Android原理揭秘系列之View、ViewGroup

作过Android 应用开发的朋友都知道,Android的UI界面都是由View和ViewGroup及其派生类组合而成的.其中,View是所有UI组件的基类,而ViewGroup是容纳这些组件的容器,其本身也是从View派生出来的.AndroidUI界面的一般结构可参见下面的示意图: 可见,作为容器的ViewGroup可以包含作为叶子节点的View,也可以包含作为更低层次的子ViewGroup,而子ViewGroup又可以包含下一层的叶子节点的View和ViewGroup.事实上,这种灵活的Vi

HCNP学习笔记之OSPF协议原理及配置1-基础知识

7.25日在济南博赛参加了HCNP的培训,感觉和HCDA不同,内容偏重理论,多而杂,现整理一下,和大家分享,也希望得到高手的指点. 先说下学习的感想和给初学者的建议: 学习的过程本身对自己就一种锻炼,要做好吃苦的准备,坚持下去,你一定会取得不凡的成就. 理论学习和操作是个迭代的过程. 很多同学花时间去背命令,我觉的不是可取的.命令只是一个工具,可以通过练习强化.但我们除了要知道怎么作(操作),还要知道为什么要这么做(理论).这样很好的解决实际当中遇到的问题. 所以,学习应该是理论-实践-理论-实

Android学习笔记View的工作原理

自定义View,也可以称为自定义控件,通过自定义View可以使得控件实现各种定制的效果. 实现自定义View,需要掌握View的底层工作原理,比如View的测量过程.布局流程以及绘制流程,除此之外,还需要掌握View常见的回调方法.而对于那些具有滑动效果的自定义View,我们还需要处理View的滑动,如果遇到滑动冲突则需要处理相应的滑动冲突. 下面是View的常见回调方法: 构造方法 onAttach onVisibilityChanged onDetach onFinishInflate on

C++学习笔记之模版 remove_reference(引用移除)

int main() { int a[] = {1,2,3}; decltype(*a) b = a[0]; a[0] = 4; cout << b; //输出4 return 0; } 输出为4,因为decltype(*a)返回*a的类型,实际上是一个int&,我们就想有没有办法去掉这个引用 尝试1 template <typename T> class remove_reference { public: typedef T type; }; int main() {

CCNA学习笔记10-二层交换原理

点到点: 例如ppp 多路访问网络MA:以太网II(广播) 非广播多路访问NBMA:帧中继 广播网络.早起hub连接,利用CSMA/CD.如今使用交换机隔离冲突. 冲突域: 广播域:广播就是要发送到网段上的所有节点,而不是单个节点或一组节点.要广播的节点将数据送到MAC地址为0xFFFFFFFFFFFF,就能实现上述目的.广播域由一组能够接受同组所有其他节点的广播报文的节点构成. 局域网分段:影响局域网性能的两个常见问题是:过高的冲突和过多的广播.分段将网络分割成较小的段.网桥,交换机和路由器通