第一节 面向对象程序设计方法概述
一、什么事面向对象的程序设计
1.对象
-
客观世界中任何一个事物都可以看成一个对象。
-
对象是构成系统的基本单位。
-
任何一个对象都具有静态和动态的特征。
-
静态特征称为属性,动态特征称为行为,外界给对象发出的信息一般称作消息。
-
一个对象往往包含一组属性和一组行为。
-
在C++中,每个对象由数据和函数(操作代码)两部分组成。
2.封装与信息隐蔽
-
对一个对象进行封装处理,就是把它的一部分属性和功能向外界屏蔽。也就是说把对象的内部实现和外部行为分隔开来。
-
封装性是面向对象程序设计的一个重要特点,封装在此具有两个含义:
-
把有关的数据和函数封装在一个对象里,形成程序中的一个基本单位,各个对象之间互不干扰。
-
把对象中的某些部分对外屏蔽,只留下与外界联系的接口接收外界消息称之为信息屏蔽
3.抽象
-
将一组同类对象的共同特征抽象出来,从而形成类的概念。类是对象的抽象,而对象是类的具体实例。
4.继承与重用
-
简单来说就是在之前建立的类的基础上增加新函数功能,从而变成一个新的类。
5.多态性
-
在C++中的多态性是指,由继承产生的新类,它的对象对同一个消息会作出不同的响应。例子就是一个可执行文本点击执行就是执行文件中的程序,如果这个可执行文本改成文本文件,则会启动一个编辑器来打开它。
二、面向对象程序设计的特点
-
面向对象程序设计包括两个方面:
-
设计所需的各种类和对象,即决定把哪些数据和操作封装在一起。
-
考虑怎样调用对象的成员函数实现所需操作。
三、类和对象的作用
-
类是C++的灵魂,它是实现面向对象程序设计的基础。
-
C++支持面向过程的程序设计,也支持基于对象和面向对象的程序设计。
-
基于对象就是基于类,基于对象的程序就是以类和对象为基础的,程序的操作是围绕对象进行的,再利用继承机制和多态性就成为了面向对象的程序设计。
-
把一组数据和函数放在一起,这就是面向对象程序设计中的对象。
-
程序=数据结构+算法
-
面向过程的程序设计是以数据结构为基础的算法设计。面向对象程序设计就是把一个算法和一组数据结构封装在一个对象中。
-
对象=数据结构+算法
-
程序=(对象+对象+...+对象)+消息,消息的作用就是对对象进行控制,以及确定向对象发出的命令,让对象完成相应的任务。
四、面向对象的软件开发
-
面向对象分析
-
面向对象的分析就是从客观事物和事物之间的关系归纳出有关对象以及对象之间的联系,并将具有相同属性和行为的对象用一个类来表示。
-
面向对象的设计
-
依照需求首先进行类的设计,然后以这些类为基础提出程序设计的思路和方法。
-
面向对象编程
-
C++、Dephi、VB、Java
-
面向对象的测试
-
就是以类为测试的基本单元用面向对象的方法实施测试。
-
面向对象维护
-
就是维护而已,因为类对其他子类的影响小,所以方便。
第二节 类的声明和对象的定义
-
类和对象的关系
-
类(class)是对象的抽象,不占用内存空间。对象是类的具体事例,占用内存空间。类是对象的类型。
-
声明类类型
-
类是要用户自己定义的类型,声明一个类类型与声明一个结构体类型相似。
-
定义对象的方法
-
先声明类类型,后定义对象
-
在声明类类型的同时定义对象
-
不出现类名,直接定义对象(合法但不提倡使用)
-
类和结构体类型的异同
第三节 类的成员函数
-
访问类数据的成员函数叫做类的成员函数。
-
成员函数的性质
-
成员函数可以访问本类中的所有成员,由于成员函数的成员访问限定符是public,可以通过它来访问类的其他成员,因此指定为public的成员函数可以作为类的外界的接口。
-
在类外定义成员函数
-
C++允许在类内声明成员函数的原型,然后在类外定义成员函数。 :: 是 作用域限定符 或称 作用域运算符 ,如果不使用这个符号函数就成了全局作用域中的display函数而不是成员函数。如果在 :: 前不带类名或函数名前既无类名也无 :: ,则表示函数是全局函数。类外定义函数的格式:
-
inline成员函数(内联函数)
-
C++默认在类内定义的成员函数是inline函数不用加上inline关键字,在域外定义inline函数需在函数声明时加上inline关键字。
-
成员函数的存储方式
-
C++只为对象的数据成员分配内存空间,一个类的所有对象共享一个成员函数空间,解决了系统为每个对象的成员函数都分配内存空间而造成大量浪费的问题。
第四节 对象成员的引用
一、用对象名和成员运算符访问对象中的成员
-
注意只有成员函数才可以访问类中所有成员,而在类外只能访问共有成员,且不能进行赋值等操作。
二、通过指向对象的指针访问对象中的成员
-
和C中的没有任何不同
三、通过对象的引用来访问对象中的成员
-
就是基本的C++中引用和指针的概念
第五节 类和对象的简单应用
-
教师类
-
程序如下:
#include<iostream>
using namespace std;
class Teacher {
public:
void set();
void display();
private:
int tno;
int tage;
char tname[20];
};
int main() {
Teacher A;
A.set();
A.display();
return 0;
}
void Teacher::set() {
cout<<"请输入教师编号:";
cin>>tno;
cout<<"请输入教师姓名:";
cin>>tname;
cout<<"请输入教师年龄:";
cin>>tage;
}
void Teacher::display() {
cout<<"教师的编号、姓名、年龄为:";
cout<<tno<<"、"<<tname<<"、"<<tage<<endl;
}
-
运行结果如下:
第六节 类的封装性和信息隐蔽
-
实现公用接口与私有的分离
-
使用public让成员函数能被类外访问,于是public定义的成员函数成为了公用接口,数据成员设为私有。用户只需了解公有成员函数的功能即可,不用了解这些功能怎么实现的,达成接口与实现分离。其余两种自然是私有不对外开放的,达成公有接口与私有实现的分离形成了信息隐蔽。
-
信息隐蔽的长处:
-
如果想修改或者扩充类的功能,只需修改类中有关的数据成员和成员函数即可,类外的不用修改。当接口与实现分离是,只要接口没有改变,对私有部分的修改不会影响到程序的其他部分。
-
编译时发现数据读写错误,只需检查本类中访问这些数据的成员函数即可,不用检查整个程序。
二、类声明和成员函数定义的分离
-
面向对象程序开发是,一般将类的声明(包括成员函数的声明)放到指定的头文件里,然后在程序顶部直接包含就可以调用里面的函数,就和包含其他的库一样。注意多文件程序需要建工程项目。
-
先声明类的定义,生成 .h 头文件
-
然后再编写成员函数(完善功能)定义源代码文件和主函数源代码文件。这里有个尖括号和双引号的区分,尖括号表示系统自带的,双引号表示用户自定义的。
-
最后将两个源代码文件编译后连接起来,就成为了exe可执行文件
-
也可以一起在头文件里定义类与成员函数,然后主函数调用头文件。这样少开一个cpp文件。