C++类与对象初探(1)

楔子

最近学校学到了面向对象,觉得挺有意思的。以前编程觉得单纯看变量名就好,学习后才发现自己以前是面向过程的编程思维,小程序没问题,一旦工程变大,弊端就显露无疑。

恰好学校雏燕计划也开始了,用上了面向对象的编程方法。觉得有必要留下点笔墨,记录下自己学习的过程,以供参考。


一切的开始

从第一次接触编程,变量永远是绕不开的话题。

这个变量在哪里改变了值,在哪里被引用……编程绕着变量转,一切似乎都已经完美。

这就是上一代程序员的感觉,他们把这种围绕变量,函数转的流程称为 面向过程

早期软件开发面临的问题较为简单,认清问题问题到代码实现并不是太困难的事情。随着计算机的普及和应用领域的发展,计算机处理的事情越来越复杂,规模和复杂度空前扩大。

人们忽然发现面向过程不太好使了。

面向对象?面向对象!

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)!

面向对象更加符合人的认知规律,将数据和操作封装在一起。类相当于一种新的自定义数据类型,地位等同intfloatstruct等等。因此在C++中,可以通过类名 对象名的方式创建一个属于类的对象。

下面是一个创建对象的具体代码片段:

class Candy{
  //Define
};
int main(void){
  class Candy c1;//class可以省略
  //Your Code
}

我们将Define部分称之为 类的声明 ,而其中的成员有三种访问属性:

  • public公有性成员 ,外部可访问,作为接口
  • protected保护性成员 ,外部不可访问,主要在类的继承和派生中起作用。
  • private私有成员 ,外部不可访问
    [tip type="note"]若未声明访问属性,默认为private类型。[/tip]

面向对象的优点

事实上,面向对象真正促进了软件体系的重构。

我们知道,需求是不断变化的,我们无法预知需求的变化,但是可以预测需求变化的位置。这样就给我们可乘之机,能够通过封装的方式将新代码和旧代码隔离,减少维护成本。

面向对象通过继承和映射关系,把接口,包等等概念的实现变得简单,这也为后面设计模式的推行奠定了至关重要的基础。

评论区
头像
文章目录