一、面向对象知识:
面向对象(Object Oriented)是软件开发方法,一种编程范式。面向对象的概念和应用已超越了程序设计和软件开发,扩展到如数据库系统、交互式界面、应用结构、应用平台、分布式系统、网络管理结构、CAD技术、人工智能等领域。
面向对象是一种对现实世界理解和抽象的方法,是计算机编程技术发展到一定阶段后的产物。 面向对象是相对于面向过程来讲的,面向对象方法,把相关的数据和方法组织为一个整体来看待,从更高的层次来进行系统建模,更贴近事物的自然运行模式。
1、基本思想
面向对象编程(Object Oriented Programming,OOP,面向对象程序设计)的主要思想是把构成问题的各个事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙一个事物在整个解决问题的步骤中的行为。面向对象程序设计中的概念主要包括:对象、类、数据抽象、继承、动态绑定、数据封装、多态性、消息传递。通过这些概念面向对象的思想得到了具体的体现。
2、程序设计语言
a.选择面向对象语言
采用面向对象方法开发软件的基本目的和主要优点是通过重用提高软件的生产率。因此,应该优先选用能够最完善、最准确地表达问题域语义的面向对象语言。
在选择编程语言时,应该考虑的其他因素还有:对用户学习面向对象分析、设计和编码技术所能提供的培训操作;在使用这个面向对象语言期间能提供的技术支持;能提供给开发人员使用的开发工具、开发平台,对机器性能和内存的需求,集成已有软件的容易程度。
b.程序设计风格
⑴提高重用性 ⑵提高可扩充性 ⑶提高健壮性
(一)类的实现
在开发过程中,类的实现是核心问题。在用面向对象风格所写的系统中,所有的数据都被封装在类的实例中。而整个程序则被封装在一个更高级的类中。在使用既存部件的面向对象系统中,可以只花费少量时间和工作量来实现软件。只要增加类的实例,开发少量的新类和实现各个对象之间互相通信的操作,就能建立需要的软件。
(二)应用系统的实现
应用系统的实现是在所有的类都被实现之后的事。实现一个系统是一个比用过程性方法更简单、更简短的过程。有些实例将在其他类的初始化过程中使用。而其余的则必须用某种主过程显式地加以说明,或者当作系统最高层的类的表示的一部分。
在C++和C中有一个main()函数,可以使用这个过程来说明构成系统主要对象的那些类的实例。
(三)面向对象测试
⑴算法层。
⑵类层。(测试封装在同一个类中的所有方法和属性之间的相互作用。)
⑶模板层。(测试一组协同工作的类之间的相互作用。)
⑷系统层。(把各个子系统组装成完整的面向对象软件系统,在组装过程中同时进行测试。)
二、类与对象知识
1、【案例分析】
班级 作为 (“类的对象”):
班级的静态特征,所属的系和专业、班级的人数,所在的教室等。这种静态特征称为属性;
班级的动态特征,如学习、开会、体育比赛等,这种动态特征称为行为。
任何一个对象都应当具有这两个要素,一是属性(attribute);二是行为(behavior),即能根据外界给的信息进行相应的操作。对象是由一组属性和一组行为构成的。
面向对象的程序设计采用了以上人们所熟悉的这种思路。使用面向对象的程序设计方法设计一个复杂的软件系统时,首要的问题是确定该系统是由哪些对象组成的,并且设计这些对象。在C++中,每个对象都是由数据和函数(即操作代码)这两部分组成的。
程序设计者的任务包括两个方面:
一是设计所需的各种类和对象,即决定把哪些数据和操作封装在一起;二是考虑怎样向有关对象发送消息,以完成所需的任务。各个对象的操作完成了,整体任务也就完成了。 因此人们设想把相关的数据和操作放在一起,形成一个整体,与外界相对分隔。这就是面向对象的程序设计中的对象。
在面向过程的结构化程序设计中,人们常使用这样的公式来表述程序∶ 程序=算法+数据结构
面向对象的程序组成:
对象 = 算法 + 数据结构
程序=(对象+对象+对象+……)+ 消息 ,消息的作用就是对对象的控制。
程序设计的关键是设计好每一个对象以及确定向这些对象发出的命令,使各对象完成相应的操作。 每一个实体都是对象。有一些对象是具有相同的结构和特性的。 每个对象都属于一个特定的类型。 在C++中对象的类型称为类(class)。类代表了某一批对象的共性和特征。类是对象的抽象,而对象是类的具体实例(instance)。
2、【类的定义】
类是一种复杂的数据类型,它是将不同类型的数据和与这些数据相关的运算封装在一起的集合体。 类将一些数据及与数据相关的函数封装在一起,使类中的数据得到很好的“保护”。在大型程序中不会被随意修改。
例:
class Student //设计一个类:用来描述学生信息
{
public: //公有成员
void InputData()
{
cout << "请输入学号:";
cin >> No_ID;
cout << "请输入姓名:";
cin >> name;
cout << "请输入分数:";
cin >> score;
}
void OutputData(); //函数声明
double average;//平均分
private: //私有成员
int No_ID;//学号
string name; //姓名
double score; //分数
protected: //保护成员
};
1)用关键字priviate限定的成员称为私有成员,对私有成员限定在该类的内部使用,即只允许该类中的成员函数使用私有的成员数据,对于私有的成员函数,只能被该类内的成员函数调用;类就相当于私有成员的作用域。
2)用关键字public限定的成员称为公有成员,公有成员的数据或函数不受类的限制,可以在类内或类外自由使用;对类而言是透明的。
3)而用关键字protected所限定的成员称为保护成员,只允许在类内及该类的派生类中使用保护的数据或函数。即保护成员的作用域是该类及该类的派生类。
每一个限制词(priviate、public、protected)在类体中可使用多次。一旦使用了限制词,该限制词一直有效,直到下一个限制词开始为止。
如果未加说明,类中成员默认的访问权限是private,即私有的。
在类体外定义成员函数的格式:
<type> < class_name > :: < func_name > (<参数表>) { ...... //函数体 }
void Student::OutputData() //函数实现在类外,需加: (类::)
{
cout << "输出学生信息如下:" << endl;
cout << "学号:" << No_ID << endl;
cout << "姓名:" << name << endl;
cout << "分数:" << score << endl;
}
3、【内联函数】
当我们定义一个类时,可以在类中直接定义函数体。这时成员函数在编译时是作为内联函数来实现的。 同时,我们也可以在类体外定义类的内联成员函数,在类体内说明函数,在类体外定义时,在成员函数的定义前面加上关键字inline。
inline void Student::OutputData() //函数实现在类外,需加: (类::)
{
cout << "输出学生信息如下:" << endl;
cout << "学号:" << No_ID << endl;
cout << "姓名:" << name << endl;
cout << "分数:" << score << endl;
}
4、【对象及使用】
一个对象的成员就是该对象的类所定义的成员,有成员数据和成员函数,引用时同结构体变量类似,用“.”运算符。
用成员运算符“.”只能访问对象的公有成员,而不能访问对象的私有成员或保护成员。若要访问对象的私有的数据成员,只能通过对象的公有成员函数来获取。
Student stu1; //该对象的作用域在main()函数体内
stu1.InputData();//调用输入函数为私有数据成员赋值
stu1.OutputData();//调用输出函数将学生信息数据输出
5、【类作用域、类类型的作用域和对象的作用域 】
类体的区域称为类作用域。类的成员函数与成员数据,其作用域都是属于类的作用域,仅在该类的范围内有效,故不能在主函数中直接通过函数名和成员名来调用函数。
类类型的作用域:在函数定义之外定义的类,其类名的作用域为文件作用域;而在函数体内定义的类,其类名的作用域为块作用域 。
对象的作用域与前面介绍的变量作用域完全相同 , 全局对象、局部对象、局部静态对象等。