Day0x00在古代,人类主要使用二进制编程,人类需要记住数据在内存中的地址才能读写。比如取出地址0x3A6F27的值和地址0x3A6F39的值,然后将两个值相加。冗长、难以记住的地址对人类来说是一种痛苦。仁慈的上帝要拯救人类脱离苦难。他说:必有变数!用变量来表示内存中的值。人类不解:地址呢?上帝给了人类一个宝贝,叫做编译器:“别担心,编译器把它背后的脏活都做了,这样写代码就容易多了!”x+y人类非常幸福。0x01天,内存中有一条数据,它的值为01100111011011000110111101100010A部落的人读出来,说是32位整数1735159650B部落的人也读出来,说这是一个浮点数1.116533*10^24C部落的人说A部落和B部落都不对。这是一条机器指令,三个部落争论不休。上帝安慰人类说:你们都很好!信息=位+上下文。这串二进制代表什么样的信息,需要上下文才能理解。因此,必须有一个数据类型!诠释x;//表示x指向一个整数floaty;//表示y指向一个浮点数人类很高兴,为了自己的方便,创造了byte,boolean,short,char,long等各种数据类型。有一小部分人真的很怀念那个可以直接操纵记忆的日子,那是自由自在的生活!仁慈的上帝决定满足他们:一定要有指点!整数*x;//x是整型指针,可以作为寻址操作。x++;//操作的是地址,不是值x--;这些人行为不检点,经常乱搞内存,所以老天爷严格限制了指针的使用,只有C、C++等少数语言可以使用指针来操作内存。其他语言不能用!Day0x02人类很快发现这些基本数据类型在编程中远远不够。比如你要表达一本书的信息,需要名称、作者、书号、价格、出版日期等一堆数据,需要几种数据类型的组合。上帝告诉人类:要想拥有自定义数据类型,就要结合基本数据类型!typeDate{intyear;intmonth;intday;}typeBook{Stringname;Stringauthor;floatprice;Datepublish_date}人类很高兴,为了自己的使用,他们写了Student,Company,Department,Employee,Manager等多种数据类型.已创建。不满足的人类在day0x03发现程序经常需要对这些自定义类型进行操作,这些操作被称为函数。功能和类型是分开的,很不方便。大神说:要有抽象数据类型,把类型和函数放在一起typeStack{//Dataintsize;int[]values;...//Operationvoidpush(intvalue);intpop();intsize();}Human说:“天哪,这是一个抽象数据类型,只有接口,没有具体的实现。”上帝说:“哦,懒惰的人类,不会思考的人类,我再给你一个东西:类,在类中写代码实现它。”人类很高兴,把数据和函数放在一起,实现了很多“类”,List、Stack、Queue、Tree……在0x04天,人类发现了一个类,定义好之后,改起来不容易使用,例如:classStack{intsize;int[]values;voidpush(intvalue){...}intpop(){....}}这个stack只支持push和pop整数,人类想用float类型,string类型,甚至Student类型,Company类型stack,还得重写一套代码,这真烦人!人类说:天啊,我们能不能对一个已有的类改一点点?上帝说:当然必须要有生成类的类,也就是templates.classStack
