面向对象的程序设计
面对对象的程序 = 类 + 类 + .... +类
设计程序的过程,就是设计类的过程。
面对对象的程序设计方法:
1.将某类客观事物共同特点(属性)归纳出来,形成一个数据结构(可以用多个变量描述事物的属性);
2.将这类事物所能进行的行为也归纳出来,形成一个个函数,这些函数可以用来操作数据结构
(这一步叫“抽象”)。
3.通过某种语法形式,将数据结构和操作该数据结构的函数“捆绑”在一起,形成一个“类”,从而使得数据结构和操作该数据结构的算法呈现出显而易见的紧密关系。(这就是“封装”)。
面向对象的程序设计具有“抽象”,“封装”,“继承”,“多态”四个基本特点。
用class定义类
类的定义:class 类名{};
1.从客观事物抽象出类
通过类,可以定义变量。类定义出来的变量,也成为类的实例,就是我们所说的“对象”。
在C++中,类的名字就是用户自定义的类型的名字。可以像使用基本类型那样来使用它。
CRectangle 就是一种用户自定义类型。
对象的内存分配
和结构变量一样,对象所占用的内存空间的大小,等于所有成员的大小之和。
对于上面的CRectangle 类,sizeof(CRectangle) = 8
每个对象各有自己的储存空间。一个多想的某个成员变量被改变了,不会影响到另一个对象。
对象间的运算
和结构变量一样,对象之间可以用 “=” 进行赋值,但是不能用 “==”,“!=”,“<”,“>”,“<=”,“>=”进行比较,除非这些运算符经过了“重载”。
类与对象的关系
*类相当于设计出来的图纸,对象相当于产品
1.对象是现实中的对象在程序中的模拟。
2.类是同一类对象的抽象,对象是类的某一特定实体。
3.定义类的对象,才可以通过对象使用类中定义的功能。
使用类的成员变量和成员函数
用法1 :对象名.成员名
用法2:指针->用户名
用法3:引用名.成员名
类的成员函数和类的定义分开来写
CRectangle::说明后面的函数是CRectangle类的成员函数,而非普通函数。那么,一定要通过对象或对象的指针后对象的引用才能调用。
类成员的可访问范围
定义一个类
如果某个成员前面没有上述关键字,则缺省的被认为是私有成员。
在类的成员函数内部,能够访问:
1.当前对象的全部属性、函数;
2.同类其他对象的全部属性、函数。
在类的成员函数以外的地方,只能够访问该类对象的公有成员。
设置私有成员的机制,叫“隐藏”
“隐藏”的目的是强制队成员变量的访问一定要通过成员函数变量进行,那么以后成员变量的类型等属性修改后,只需要更改成员函数即可。否则,所有直接访问成员变量的语句都需要修改。
“隐藏”的作用
如果将上面的程序移植到内存空间紧张的手持设备上,希望将szName改为char scName[5],若szName不是私有,那么就要找出所有类似strcpy(e.szName,"Tom123456789");
这样的语句进行修改,以防止数组越界。这样做很麻烦。
如果将szName变为私有,那么程序中就不可能出现(除非在类的内部)
strcpy(e.szName,"Tom123456789");这样的语句,所有对szName的访问都是通过成员函数来进行,比如:e.setName("Tom123445");
那么,就算szName改短了,上面的语句也不需要找出来修改,只要改setName成员函数,在里面确保不越界就可以了。
::的作用
"::"
在C++中表示作用域,和所属关系。 "::"
是运算符中等级最高的,它分为i三种,分别如下:
1.作用域符号:
作用域符号”::“的前面一般是类名称,后面一般是该类的成员名称,C++为例避免不同的类有名称相同的成员而采用作用域的方式进行区分。
例如:A,B表示两个类,在A,B中都有成员member。
那么:
1、A::member就表示类A中的成员member。
2、B::member就表示类B中的成员member。
2. 全局作用域符号
::在最开头开始,表示顶层命名空间(全局变量)
全局作用域符号:当全局变量在局部函数中与其中某个变量重名,那么就可以用 :: 来区分,例如:
3.作用域分解运算符
::是C++里的作用域分解运算符,“比如声明了一个类A,类A里声明了一个成员函数voidf(),但没有在类的声明里给出f的定义,那么在类外定义f时,就要写成voidA::f(),表示这个f()函数是类A的成员函数。例如:
用struct定义类
和用“class”的唯一区别,就是为说明是公有还是私有的成员,就是公有。
成员函数的重载及参数缺省
成员函数可以带缺省参数,成员函数也可以重载。
输出是5。