标签:c++
1:理解的类的定义
面向过程的编程将世界织成了一张网,网的节点环环相扣
面向对象的编程将世界分成了块,块与块之间相互关联和独立
在c++没有出现之前,c++之父或许发现了c语言的很多弊端,于是引进了类,但是为什么要引进类了,这里,我站在当时的一个立场,比如我当时就在上世纪70年代末,那个时候只有c语言等面向过程的语言,沿着这个思路,开始弥补c语言的不足,然后怎么引进类,可能有很多问题,也算是帮我再从另一个角度上理解c++
2:时光推到1979年
这个时候c语言之父,他已经完成了c语言开发linux的全部工作,一个学生当时他们的计算机课程的编程课可能有c语言,有b语言
他每次编写一些相关性的数据的时候,都要用c语言反复的写一遍,特别的麻烦,而且,当他重新要利用这段代码的时候,他要将以前的代码重新的编写一遍,我们可以想想,在80年代初,那个时候计算机主要是ibm公司的大型的计算机,微软公司还没有成立,dos系统还没有出来,那个时候才存储器只有16k的空间,那个时候,那个同学,他的很多代码块可能都是手抄在本上,一些特别常用的代码,他可能会存在存储器上,毕竟当时的存储器特别小而且特别的昂贵,就是在这种环境下,这个同学上了几年的大学,他已经非常的不满意当时c语言的繁琐了,但是毕竟对当时的汇编来说,c还是有很大的改进的,这位同学在学校可能编写了几年的代码,他特别的善于将一些有用的代码或者一些类似的东西分类,这样或许能帮他解决寻找代码的问题,不要小瞧这个代码分类的方法,那时候可能是很多程序员经常头疼的事情
他在生活中,他会将一些硬件存储器放到一起,一些硬件放到一起,一些电子放到一起,并且全部都编上号码,当他要用处理器的时候,他会在处理器那个箱子里面寻找存储器,知道存储的编号,他会在更小的箱子里面去寻找,这个方法,工业上的5s管理或许就是这个方法的体现,反正这种方法帮助这位同学节省了不少的时间,日常生活中,他也会将书,衣物,餐具等全部分类,这样都能大大的减少他的日常琐事的时间,让他花费更多时间去处理计算机的代码
尽管他将代码全部分类,但是还是不能满足他的需求,而且反反复复的代码或许让他购买了很多的存储器来存储代码片段,计算机代码不是日常生活的事情那么简单,代码的类别越来越多,他发现很多时候他找不到他的代码。
他是个善于思考的人,不能仅仅的冲代码片段上来改善,得从c语言的数据结构上改善,来简化自己的工作量,于是他迈出了第一步,将数据开始分类,将方法开始分类
可能,他刚开始想到的是结构体,刚开始或许并没有想到类这个概念,刚开始也没有访问权限的想法,只是试着按照生活习惯的方法,将一些过程集体整理,比如,日常我的床上有床单,枕头,凉席,等等,但是这些都是床上用品,我每次去超市的时候,我如果需要被子,肯定去床上用品区找,然后再被褥区找,最后找到被子,数据能不能这样呢
比如我见到一个人,这个人的特征太多了,有很多特征我一时还想不起来,但是我知道他的名字叫吉姆,他的身高185,体重80磅,男的,以后有特征我在加,我只需要记得这个人就行了,于是这个同学写出了他的概念,他用struct这个关键词来表示,这个是这个吉姆的一些数据,这个数据可能就是结构体
但是他又认识了山姆,还得重新将这些全部定义,特别的麻烦,后面还会认识很多人,人与人之间不可能都是透明的,这也不符合周围的日常规范,于是他又定义了类,用class关键词来表示,class默认的是私有的,为了避免以后出现吉姆,山姆,等反复重写的弊端,这位同学他干脆用一些更加抽象的东西,他或许经过了几个月的研究,可能开发出了他的第一个对象化的代码,代码功能如下:
#include <iostream> using namespace std; class student { private: char *name; int age; int sex; public: void setstuname(char *sname); void setstuage(int sage); void setstusex(int ssex); public: void getstuname(); void getstuage(); void getstusex(); }; void student::setstuage(int ssage) { age=ssage; } void student::setstuname(char *sname) { name=sname; } void student::setstusex(int ssex) { sex=ssex; } void student::getstuage() { if(age<0) { cout<<"年龄没有设置"<<endl; } else { cout<<"年龄:"<<age<<endl; } } void student::getstusex() { switch (sex) { case 1 : cout<<"性别:男"<<endl; break; case 2 : cout<<"性别:女"<<endl; break; default: break; } } void student::getstuname() { cout<<"姓名:"<<name<<endl; } int main() { student stu; stu.setstuage(15); stu.setstusex(1); stu.setstuname("lucy"); stu.getstuname(); stu.getstuage(); stu.getstusex(); return 0; }当然那个时候还没有命名空间,还iostream还没有标准化
他的这段代码,成功的将一些数据和方法成功的归纳到class 关键词定义的student类中,并且将姓名,年龄,性别这三个属性当成这个类中的私有的对象,这个类通过实例化一个成员,解决了吉姆和山姆的问题,大大的方便了编程的效率
有了第一段代码,发现编写这段代码他过臃肿,而且特别的复杂,实现的功能也特别的简单,能不能设置一个特殊的函数,将类里面实例化的时候的一些初始化全部包含起来呢,这或许就是构造函数的前身
经过几个月的更改,他将上述代码改成了下面的代码
#include <iostream> using namespace std; class student { private: char *name; int age; int sex; public: student(char *sname,int sage,int ssex); ~student(); public: void getstuname(); void getstuage(); void getstusex(); }; student::student(char *sname,int sage,int ssex) { age=sage; name=sname; sex=ssex; } student::~student() { } void student::getstuage() { if(age<0) { cout<<"年龄没有设置"<<endl; } else { cout<<"年龄:"<<age<<endl; } } void student::getstusex() { switch (sex) { case 1 : cout<<"性别:男"<<endl; break; case 2 : cout<<"性别:女"<<endl; break; default: break; } } void student::getstuname() { cout<<"姓名:"<<name<<endl; } int main() { student stu("lucy",15,1); stu.getstuname(); stu.getstuage(); stu.getstusex(); return 0; }
他将这个编程的世界由面向过程的转换成了对象化的,让编程更加的贴近周围的环境
针对构造函数,为了弥补一些不需要初始化的类,这位同学他也为每个类都提供了默认的构造函数和默认的析构函数,使这个特性更加的广泛。
之后,有了这个面向对象的基本概念,这位同学开始了他的下一步工作,他要将现在他的以前编写的所有代码,看能不能通过面向对象这个思维编写,于是,在class和struct的两个关键词,配合“.”的符号,他开始实例化他以前的代码,以及一些计算机资源的实例化,这里可能就有stl的一些前身,当然这些也不完善
在疯狂编写的背后,这位同学渐渐的有些吃不消了,他忽然又发现他陷进c语言刚开始的问题里面去了,以前没有将编程对象化的时候,他管理的是大量的代码片段,而现在,他要管理的是大量的类,类五花八门,他定义了猫类,定义了狗类,定义了老虎类,发现越来愈多,干脆全部删除,先定义个哺乳类,忽然,但是猫,老虎之间各有各的特性,有共同点,也有不同点,简简单单的通过public和protect和private几个不能完全的区分众多的类,这个问题该怎么解决呢。
他看着自己编写的类,尽管讲一些类规整到一起了,但是,这些类里面也有很多重复的东西,实例化的老虎这个之间省去了很多的代码,老虎甲和老虎已通过实例化的名称可以完全的区分开,但是老虎和猫比如他们都会跑,这个跑又是狗也具有的,那能不能在类之间也建立一个类似老虎甲和老虎已的一个老虎类呢
这问同学按照他构建类的思路上,开始构建他的基类,哺乳动物类甚至更上一级的动物类
c语言于是出现了继承和派生,下一节继续分析吧
标签:c++
原文地址:http://blog.csdn.net/panker2008/article/details/46412347