一、类和对象的基本概念
结构化程序设计
C语言使用结构化程序设计:
程序 = 数据结构 + 算法
程序由全局变量以及众多相互调用的函数组成 。算法以函数的形式实现,用于对数据结构进行操作。
结构化程序设计的不足
1.结构化程序设计中,函数和其所操作的数据结构,没有直观的联系。
2.随着程序规模的增加,程序逐渐难以理解,很难一下子看出来:
某个数据结构到底有哪些函数可以对它进行操作?
某个函数到底是用来操作哪些数据结构的?
任何两个函数之间存在怎样的调用关系?
3.结构化程序设计没有“封装”和“隐藏”的概念。 要访问某个数据结构中的某个变量,就可以直接访问,那么当该变量的定义有改动的时候,就要把所有访问该变量的语句找出来修改,十分不利于程序的维护、扩充。
4.难以查错,当某个数据结构的值不正确时,难以找出到底是那个函数导致的。
5.重用:在编写某个程序时,发现其需要的某项功 能,在现有的某个程序里已经有了相同或类似的 实现,那么自然希望能够将那部分代码抽取出来, 在新程序中使用。
6.在结构化程序设计中,随着程序规模的增大,由 于程序大量函数、变量之间的关系错综复杂,要抽取这部分代码,会变得十分困难。
总之,结构化的程序,在规模庞大时,会变得难以理解,难以扩充(增加新功能),难以查错,难以重用。
- 如何更高效地实现函数的复用?
- 如何更清晰的实现变量和函数的关系?使得程序 更清晰更易于修改和维护。
面向对象的程序设计
面向对象的程序 = 类 + 类 + …+ 类
面向对象的程序设计方法:
将某类客观事物共同特点(属性)归纳出来,形成一个数据 结构(可以用多个变量描述事物的属性);
将这类事物所能进行的行为也归纳出来,形成一个个函数, 这些函数可以用来操作数据结构(这一步叫“抽象”)。
然后,通过某种语法形式,将数据结构和操作该数据结构的函 数“捆绑”在一起,形成一个“类”,从而使得数据结构和操作该数据结构的算法呈现出显而易见的紧密关系,这就是“封装”。
面向对象的程序设计具有“抽象”,“封装”“继承”“多态” 四个基本特点。
例如:
将长、宽变量和设置长,宽,求面积,以及求周长的三个函数“封装”在一起,就能形成一个“矩形类”。
长、宽变量成为该“矩形类”的“成员变量”,三个函数成为该类的“成员函数” 。 成员变量和成员函数统称为类的成员。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
通过类,可以定义变量。类定义出来的变量,也称为类的实例,就是我们所说的“对象” 。
C++中,类的名字就是用户自定义的类型的名字。可以象使用基本类型那样来使用它。CRectangle 就是一种用户自定义的类型。
1 2 3 4 5 6 7 8 9 10 |
|
对象的内存分配
类的内存分配与结构体分配内存相同,类的成员函数所占内存不属于类。
每个对象各有自己的存储空间。一个对象的某个成员变量被改变了,不会影响到另一个对象。
和结构变量一样,对象之间可以用 “=”进行赋值,但是不能用 “==”,“!=”,“>”,“<”“>=”“<=”进行比较,除非这些运算符经过了“重载”(第四篇讲)。
使用类的成员变量和成员函数
用法1:对象名.成员名
1 2 3 |
|
用法2: 指针->成员名
1 2 3 4 5 |
|
用法3:引用名.成员名
1 2 3 4 |
|
二、类和对象基础 类成员的可访问范围
在类的定义中,用下列访问范围关键字来说明类成员
可被访问的范围:
private: 私有成员,只能在成员函数内访问
public : 公有成员,可以在任何地方访问
protected: 保护成员,后面再说,暂时理解和私有成员类似
以上三种关键字出现的次数和先后次序都没有限制。
代码如下(示例):
1 2 3 4 5 6 7 8 |
|
如过某个成员前面没有上述关键字,则缺省地被认为是私有成员。
1 2 3 4 5 6 7 8 |
|
在类的成员函数内部,能够访问:
- 当前对象的全部属性、函数;
- 同类其它对象的全部属性、函数。
在类的成员函数以外的地方,只能够访问该类对象的公有成员。
成员函数在类内声明,一般在类外实现(也可类内声明并实现),需要加上“类名::”。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
|
设置私有成员的机制,叫“隐藏”
- “隐藏”的目的是强制对成员变量的访问一定要通过成员函数 进行,那么后成员变量的类型等属性修改后,只需要更改成员函数即可。否则,所有直接访问成员变量的语句都需要修改。