当前位置:C++技术网 > 资讯 > 什么是类,类的本质

什么是类,类的本质

更新时间:2015-06-24 18:00:34浏览次数:1+次

    多数学习编程的人看到类就联想到面向对象,或者理解为类就是面向对象的代名词。然而,结合到面向对象,你理解了类了吗?
    类在C语言中不存在的。或者说,这个概念在C语言是不存在的,但是形式上,究其本质,结构体就是类。要真正理解类理解面向对象,类的基本理解一定要到位。否则越往后学,越迷糊。
    再继续往下看前,请放下类与面向对象之间沉重的负担,轻松的看看类是什么。不过需要说清楚,此文的目的不是宣讲技术要点,而是辅助深入理解,将读者从面向对象的丛林中带出到丛林外重新审视类,还原类的本来面目。这是一场思维的变化,希望明白这点,技术要点教科书大把的有,没必要花大把时间在这上面。
    C++中提出类的概念,带有权限访问控制,可以自定义数据类型。然而,C++的目标是要实现类的标准化,达到使用类要跟使用基本类型一样的效果。只不过,要实现这些,借助了面向对象的功能,重载了各种操作符,使之在使用上和基本类型没有两样。为什么呢?这样在逻辑上更容易理解,它的目标就是让程序员定义的类与基本的类型同等对待。
    也就是说,我们正确理解类的概念不应该站在面向对象的角度来理解,这样会让我们带入循环矛盾中。类的机制是用面向对象的技术提供支持的,然而我们理解类又是用面向对象去理解了,最后,我醉了。
    这样的理解方式其实偏移了C++类设计的本来原则。本来它是想实现让我们将类与基本类型同等对待,这样简化理解。然而我们却不这样理解,偏偏理解的那么深入,反而就绕进去了。记得上面向对象的课时,(我因为是非计算机专业的,就选了公选课Java学习的面向对象,之前学过了C语言,知道面向过程),老师一开始讲面向对象,讲到类就与对象进行说明,用汽车来打比喻等等。如果没有学过任何语言,用汽车比喻来理解面向对象是挺好的,但是直接就说,汽车就好比类,具体的一辆汽车好比对象,然后就。。。(此处省略各种描述)。然而类是什么,我们开始都是迷迷糊糊的,只是知道老师说这个是类,这个对象。
    然而在书中,有了面向过程的基础的知识后,介绍面向对象就说类,如何声明类,怎么实例化,实例化是什么,什么是对象等等。我个人觉得,像这种抽象的概念,我们应该从它为什么产生有什么使命等来理解它,这样我们就很容易掌握,万变不离其宗嘛。
         类之所以为类,代表的就是一个类型。类在使用时,很多人与对象区分不开。结构体与类型也是分不清楚。有人说类是一个模板,用来生产对象的,类中没有真正分配变量等等。类和结构体就是一种类型,这在《C/C++声明定义初始化和赋值独家剖析深刻理解》中说的很清楚。可以把类当做结构体的一种延伸,它就是一个数据类型而已,只一个自定义类型,与结构体差不多。所以在定义类的时候,因为是在定义一种类型,所以很多地方是不允许的。不没想过整型里面还可以存一个数据吧,而整型和类声明后的类就是一个类型的东西,自然,类中也是不能存储数据的。它只是一个数据类型声明而已,只是告诉编译器,这个类应该占多大内存,内部是如何构造的。只达到这个目的而已。如果还是感觉类很大,那先用结构体来理解。类就是结构体的扩展,是结构体的超集。所以在此基础上,在来理解类,你就很清楚,为什么类声明中不能给变量初始化,因为变量在这里只是告诉编译器,这个变量在声明的类中所处的位置和占用的内存空间,并不需要你给它存储数据。对于类的声明,不要叫做“定义类”,这种叫法是错误的,只能叫做“声明一个类”,这在《C/C++声明定义初始化和赋值独家剖析深刻理解》中说的很清楚。而常量的赋值是一个特殊情况,因为常量固有的属性就是常量定义后的值是不能更改的,为了平衡两者的语法,就要让其再内部定义后初始化。初始化后其实就当做是一个固定成员变量类型,有固定的大小和结构,且不能更改。
    所以,始终记住一点,类就是数据类型而已,别把它看得太高了。类和结构体极其相似。你声明类只是在自定义一个数据类型而已,而对象则是你用你定义的自定义类型定义的一个变量而已。而对象的初始化,则是构造函数完成的,并不是基本类型的赋值。这是这种自定义类型的特殊语法而已,思想是一样的。这样就可以把基本类型和自定义的类型统一起来理解了,而不是孤立的两点。这样你理解就轻松多了。其实类和对象,站在另一个角度,其实和基本的类型没有什么两样,只是语法有点差异罢了,思想都是一致的。
    我相信看到这里,理解到这里,类,也只不过和结构体一样,变成了轻量级的东西了,也不是那么说不清楚的东西了。不断的思考了理解,然后各种曾经以为好了不起的东西,都成为了1+1而已。其实就这样,没什么。但是如果你没有走出来,或者绕不出来,就麻烦大了。
    本文从头到尾,都是在透露一个思想,统一简化标准化,把类与基本类型统一对待,看到类设计的初衷。