【C++进阶】结构体和类的区别及面向对象的认识

来源:互联网 发布:知乎的通知怎么删除 编辑:程序博客网 时间:2024/05/17 03:33

结构体和类的区别以及面向对象的认识

1.C的结构体和C++结构体的区别

   1.1 C的结构体内不允许有函数存在,C++允许有内部成员函数,且允许该函数是虚函数。所以C的结构体是没有构造函数、析构函数、和this指针的。

   1.2 C的结构体对内部成员变量的访问权限只能是public,而C++允许public,protected,private三种。

   1.3 C语言的结构体是不可以继承的,C++的结构体是可以从其他的结构体或者类继承过来的。

   以上都是表面的区别,实际区别就是面向过程面向对象编程思路的区别:

       C的结构体只是把数据变量给包裹起来了,并不涉及算法。

       而C++是把数据变量及对这些数据变量的相关算法给封装起来,并且给对这些数据和类不同的访问权限。

    C语言中是没有类的概念的,但是C语言可以通过结构体内创建函数指针实现面向对象思想。

 2.C++的结构体和C++类的区别

   2.1 C++结构体内部成员变量及成员函数默认的访问级别是public,而c++类的内部成员变量及成员函数的默认访问级别是private。

   2.2 C++结构体的继承默认是public,而c++类的继承默认是private。

3.面向对象的认识

对于面向对象对于像我这样的一个初级CPPer来说还需要更为深刻的理解。我想不同水平的开发者会对这个概念给出不同程度的认识。
        下面说说我的个人理解,开始之前我必须承认,这个概念的范畴显然超过了我现在所能掌握的范畴,希望对大家的帮助多余误导。
        首先,我们必须承认面向对象是一种编程思想,这种思想的出现我想也是软件开发在进化过程中的一个合理的产物。至少它的出现解决了许多面向过程编程中的许多问题。让系统的可以更容易的维护。个人觉得面向对象是程序相关人员的一种对于现实问题和程序设计以及开发之间的一种认识论。 通过这种理论,他们将现实中的需要解决的问题成功的抽象,建模,并将之映射到程序开发中,并用代码解决问题。
其次,面向对象的三个特性,我想这是一个老生常谈的问题了。但是,不得不承认的是,不通水平的人在这三个特性的理解存在着不同水平上的差别。这种不通程度的理解,在工作中的程序设计和编码过程中得到了最好的体现。好的程序员可以将代码写的很有逻辑,简洁调理,富有美感;水平差的程序员可能就只能过程化的实现一些功能,这显然是还没有完全理解并将面向对象的精华吸收(至少我现在还是这个样子)。
那现在就提一下这三个概念:(抽象、)封装、继承、多态。
        谈到这三个概念的时候,我更愿意在这三个概念之前把“抽象”单独拿出来作为强调。因为,它是良好体现这三个特性的先决条件。一个良好的抽象是一个实现封装的开始,一个类设计的好不好,就看抽象的是不是合理。一个不合理的抽象是封装不出好东西的(个人观点)。抽象就是找到一个合理的映射关系,将现实问题按合理的方式映射到程序中。将合理的数据和行为抽出来,完成一个数据抽象,并将描述客体的属性和行为绑定在一起,实现统一的抽象,从而达到对现实世界客体的真正模拟
       下面是封装,封装是指将现实世界中存在的某个客体的属性与行为绑定在一起,并放置在一个逻辑单元内,并进行权限的分配和控制(通过关键字 public, protected,private实现)。该逻辑单元负责将所描述的属性隐藏起来,外界对客体内部属性的所有访问只能通过提供的用户接口实现。这样做既可以实现对客体属性的保护作用,又可以提高软件系统的可维护性。只要用户接口不改变,任何封装体内部的改变都不会对软件系统的其他部分造成影响。结构化设计方法没有做到客体的整体封装,只是封装了各个功能模块,而每个功能模块可以随意地对没有保护能力客体属性实施操作,并且由于描述属性的数据与行为被分割开来,所以一旦某个客体属性的表达方式发生了变化,或某个行为效果发生了改变,就有可能对整个系统产生影响。封装是类和对象的主要概念,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。我想到了这一步,一个类就应该在脑海中开始渐渐清晰起来了。并且这一阶段完成的时候也意味着整个系统各单元之间的解耦操作也初步完成了。
       然后就是继承。如果说封装是努力的将不相关的行为和数据进行隔离以期达到解耦的作用,继承无疑实在封装的基础上加强了父类和子类之间的耦合关系。但是这种可信赖的继承关系建立在合理的封装的基础上时,无疑会获得很好的复用性。这才是面向对象能给我们带来的便利,当然也是我们做这些工作最期望的达到的结果。试想一下,如果我们封装了一个很烂的类,那无疑是一件令人崩溃的事情。我想程序中没有比这个更糟糕的了。
       最后要说下多态。我觉的这真的是一件很神奇的事情,难道不是吗?一个类可以根据运行时的需要动态的选择一个适合自己的方法执行。这对于程序员来说无疑是一件非常值得兴奋的事情。当然这需要程序员去做函数重载或者运用虚函数进行覆盖,或者两种方法都用。即便这样我想这也是面向对象编程工作中一件值得骄傲的事情。合理的运用重载和virtual居然会给我们带来如何多的便利。

   

本文参照了:http://www.cnblogs.com/vace/archive/2011/04/14/2015754.html

                     http://wenku.baidu.com/view/8d961beb856a561252d36fb1.html