楔子
最近学校学到了面向对象,觉得挺有意思的。以前编程觉得单纯看变量名就好,学习后才发现自己以前是面向过程的编程思维,小程序没问题,一旦工程变大,弊端就显露无疑。
恰好学校雏燕计划也开始了,用上了面向对象的编程方法。觉得有必要留下点笔墨,记录下自己学习的过程,以供参考。
一切的开始
从第一次接触编程,变量永远是绕不开的话题。
这个变量在哪里改变了值,在哪里被引用……编程绕着变量转,一切似乎都已经完美。
这就是上一代程序员的感觉,他们把这种围绕变量,函数转的流程称为 面向过程 。
早期软件开发面临的问题较为简单,认清问题问题到代码实现并不是太困难的事情。随着计算机的普及和应用领域的发展,计算机处理的事情越来越复杂,规模和复杂度空前扩大。
人们忽然发现面向过程不太好使了。
面向对象?面向对象!
20世纪60年代,一场“软件危机”席卷了整个编程界。
事实上,随着计算机发展,原本通常是一个人完成的工作需要更多人合力完成。虽然“人多力量大”听起来很美好,但是出于编程习惯的差异,代码版本控制缺失等问题,软件开发人员失望的发现,他们已经无法控制住软件的错误了……
很要命,程序员想。
可能很难理解,一个自己亲手开发的程序,为什么会落得无法控制错误的地步。可以想象下,两个无助的人漂流到荒岛,做一个简陋的茅草屋可能绰绰有余,然而,当问题变成如何建造一个100层的高楼,程序员就蚌埠住了。
复杂到一定程度,面对上千上万行的庞大代码,也只能有心无力。
虽然随之而来的Git代码管理,驼峰命名法等大杀器成功缓解了“有码难编”的困境,但是程序员最终发现,真正的问题出于面向过程本身。
面向对象 出现了,程序员看到了新的救星。
类,数据成员,成员函数
让我们从生活中寻找灵感。
糖果可以作为一个庞大的类(Class),我们发现,首先,糖果是有很多颜色的,其次,糖果还可以有不同的口味。
我们可以定义一个新的类了。
class Candy{
private:
string color;
string taste;
};
但是,结构体(Struct)依然可以替代类:
struct Candy{
string color;
string taste;
};
但是,类可以看做是结构体的一次大升级:
class Candy{
public:
void Set(string, string);
void AskTaste();
void AskColor();
private:
string color;
string taste;
};
void Candy::Set(string Color, string Taste){
color = Color;
taste = Taste;
}
void Candy::AskTaste(){
cout<<"The Candy taste like "<<taste;
}
void Candy::AskColor(){
cout<<"The Candy is "<<color;
}
类不仅包括变量(数据成员 Data Members),还可以包括函数(成员函数 Member Functions)!
面向对象更加符合人的认知规律,将数据和操作封装在一起。类相当于一种新的自定义数据类型,地位等同int
,float
,struct
等等。因此在C++中,可以通过类名 对象名
的方式创建一个属于类的对象。
下面是一个创建对象的具体代码片段:
class Candy{
//Define
};
int main(void){
class Candy c1;//class可以省略
//Your Code
}
我们将Define部分称之为 类的声明 ,而其中的成员有三种访问属性:
public
为 公有性成员 ,外部可访问,作为接口protected
为 保护性成员 ,外部不可访问,主要在类的继承和派生中起作用。private
为 私有成员 ,外部不可访问
[tip type="note"]若未声明访问属性,默认为private类型。[/tip]
面向对象的优点
事实上,面向对象真正促进了软件体系的重构。
我们知道,需求是不断变化的,我们无法预知需求的变化,但是可以预测需求变化的位置。这样就给我们可乘之机,能够通过封装的方式将新代码和旧代码隔离,减少维护成本。
面向对象通过继承和映射关系,把接口,包等等概念的实现变得简单,这也为后面设计模式的推行奠定了至关重要的基础。