一、有关类的基本知识
1、类型
仔细想想,我们通常用什么标准来判定一个数据的数据类型呢。有两个,第一个是数据的存储方式,比如char站一个自己,int占四个自己,第二个就是这种类型能够做的操作。比如整型数据可以做取余操作,但是浮点数就不可以。
所以在定义一个变量的时候,我们通常完成了下面这几件事:
(1)决定要为这个类型的变量分配的内存
(2)决定如何解释内存中的位,比如在定义数组的时候,在数组的索引+1时,到底是移动几个内存单元,是根据这个数组元素的数据类型来确定的。
(3)决定了这个变量所能够使用的方法。
PS:关于面向对象,关于类这个概念,我始终觉得,这是一个更高层次的抽象,其实我们现在使用的操作系统就已经是抽象了。为什么计算机的使用门槛越来越低,就是因为抽象的层次越来越高,如果倒退几十年,那时候的程序员是用汇编写软件的,直接和硬件打交道,哪里有什么狗屁VS编译器这种东西呢。所以,C++中的面向对象和类的概念也是一样,它把关于一个现实中的实体的一切属性和方法都做了一个打包的操作,他在里面会组织一些数据,给外部的用户提供了一些接口。在你使用这个类之前,说明书上只有这个类用什么功能,调用哪个函数,并没有告诉你这个函数是怎么实现的,从而降低了编程过程中很多的错误几率。就像我们日常生活一样,我们都不知道我们吃进去的东西是怎么在内部消化的,但是我们知道,只要是想吃东西,那就得用嘴这个“接口”,道理是一样的对吧。
2、类
类通常有两部分构成,一部分是类的声明,另外一部分是类的定义,其实类的定义主要是对类的方法的一些定义。
3、类的访问控制
类的访问权限基本有三种,分别是公有的,私有的,被保护的。共有部分可以被外部对象访问,被保护部分只能被子类访问,私有部分只能被自己本身的这个类的内部访问,其余的地方均不能访问。
4、关于类的成员方法
类的成员方法有两个特点,第一个是声明在类里面,实现在类的外面,但是实现既然在类的外边就得标识一下这个成员函数是属于哪个类的,所以才出现了利用作用域标识符来指定实现的成员函数所属的类。
为什么非要加上作用域标识符来进行限定呢,因为类里面的函数也是有作用域的,这个作用域叫做类的作用域。如果两个类同时定义了一个同名的update函数,那么两个函数在类的内部进行使用的时候,可以不加作用域标识符,并且即使同名也互不影响,因为他们的作用域不同,但是在类的外面,就是不是他们所在的作用域了,需要对他们进行明确的限定是在哪里定义的,属于哪里的。在类的成员方法中是可以访问类的私有成员的,因为只有类内部的函数才能够访问。
5、关于内联函数
内联函数在之前的博文里面提到过,简单来说就是在函数定义的时候在函数头的最前面加上inline这个关键字,等到下次碰到调用它的时候,就直接把代码复制过去,不会进行正常函数调用的那一系列的程序。在C++的类中,在类的声明里面定义的函数就默认为内联函数,因为类的声明通常来讲都在头文件中,并且在类的生命中定义的函数必定都会是比较短小精悍的那种,不然就违反了内联函数的原则。如果你仍然准备在类中声明函数原型,类的外部在定义函数,那么在定义的时候就要加上inline这个关键字。
内联函数的特殊规则决定了他必须在每个使用他的文件中都必须有相应的定义,所以最好的方式就是把内联函数放在函数的头文件中, 每个文件都引用这儿头文件。
6、方法&对象
我们都知道,一个类中的对象可以在类的外部调用类中的一些成员方法,成员方法只有一个,那么在两个对象都调用一个方法的时候,这个方法怎么来判定函数中计算的数据是属于哪个对象的呢。
很简单,那个对象调用的方法,那么这个方法里面计算的数据就是属于哪个对象的,每个对象在调用方法的时候,都会有一个相应的this指针来指向这个对象被传递进函数。所以在函数内部可以通过this->属性的方式对这个对象相应的数据进行操作。
我们都知道,C++尽量把对象变为普通的变量给我们进行使用,我们每次创建一个类的对象的时候,整个对象都会有自己的储存空间,那么一个类可以创建很多对象,如果这些对象都执行一个成员方法,那么这个成员方法也是每个对象一个么?不是的,类中的成员方法只有一个,而对象可以有很多,几个对象在调用同一个成员方法的时候都会执行同一段代码,只不过执行的数据不同。
PS:上面基本都是基础知识,所以来一个小小的总结吧,先发出去,给大家看看。
要想使用一个类,就要先定义一个类,也就是对你要创建的 这个类进行一个完整的描述,具体类中的一些实现细节在声明描述的时候不用太过担心。首先要做的就是要写一个类的声明。通常来讲,类的一些数据成员都放在私有部分中,一些成员方法都会放在公有部分中,当作是整个类的公有接口,这也是类设计的抽象部分。数据封装到私有部分保证了数据的隐藏性,公有部分的成员方法实现了公有接口的抽象部分,成员函数的实现细节被封装。
声明玩一个类的时候,接下来就可以在类的外面实现一些类中声明过的成员函数。出了内联函数这种特殊的情况之外,其余的函数都需要在类的外部加上作用域标识符进行具体的实现。
对于任何一个类的成员函数的函数名,都是有类名在里面的,也就是说,类中的成员函数的函数名,不光包括我们自己定义的,还要加上类名,毕竟这个函数是属于这个类的。用于定义的一个类,实际上就是用户自定义了一个类型,所以才有定义对象的时候直接,类名 对象名这种形式,这分明就是把类名当作了类型来看。
原文:http://blog.csdn.net/xr_acmer/article/details/39473263