码迷,mamicode.com
首页 > 编程语言 > 详细

一个同学的c++的故事(推测c++的由来)(一)

时间:2015-06-08 17:36:58      阅读:153      评论:0      收藏:0      [点我收藏+]

标签: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++的故事(推测c++的由来)(一)

标签:c++

原文地址:http://blog.csdn.net/panker2008/article/details/46412347

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!