....第八章类和对象8.1面向对象程序设计方法概述8.1.1什么是面向对象的程序设计1.对象对象的静态特征称为属性,动态特征称为行为。对象之间通过发送和接受消息互相联系。图8.1图8.2在C++中,每个对象都是由数据和函数(操作代码)两部分组成。2.封装与信息隐蔽3.抽象4.继承与重用5.多态性8.1.2面向对象程序设计的特点图8.3图8.3是传统的面向过程的程序设计。面象对象的程序设计是:把数据和有关操作封装成一个对象。程序设计的任务包括两个方面:一是设计所需的各种类和对象,即决定....把哪些数据和操作封装在一起;二是考虑怎样向有关对象发送消息,以完成所需的任务。8.1.3类和对象的作用面向过程的结构化程序设计:程序=算法+数据结构基于对象和面向对象程序设计:对象=算法+数据结构程序=(对象+对象+···)+消息8.1.4面向对象的软件开发1.面向对象分析(objectorientedanalysis,OOA)2.面向对象设计(objectorienteddesign,OOD)3.面向对象编程(objectorientedprogramming,OOP)4.面向对象测试(objectorientedtest,OOT)5.面向对象维护(objectorientedsoftmaintenance,OOSM)8.2类的声明和对象的定义8.2.1类和对象的关系在C++中对象的类型称为类。类是对象的抽象,而对象是类的具体实例。8.2.2声明类类型structStudent{intnum;charname[20];charsex;};classStudent{intnum;charname[20];charsex;voiddisplay(){coutnum:numendl;coutname:nameendl;coutsex:sexendl;}};Studentstud1,stud2;还可以改为以下声明:classStudent{private:intnum;....charname[20];charsex;public:voiddisplay(){coutnum:numendl;coutname:nameendl;coutsex:sexendl;}};Studentstud1,stud2;private和public称为成员访问限定符。被声明为私有的(private)只能被本类中的成员函数使用,类外不能使用(友元除外)。被声明为公有的(public)可以被类作用域内所有函数使用。被声明为保护的(ptotected)它不能被类外函数使用,但可以被派生类成员函数使用。8.2.3定义对象的方法1.先声明类类型,然后再定义对象2.在声明类类型的同时定义对象3.不出现类名,直接定义对象8.2.4类和结构体类型的异同用struct声明的类,如果对其成员不作private或public声明,系统默认为public.用class声明的类,如果对其成员不作private或public声明,系统默认为private.8.3类的成员函数8.3.1成员函数的性质对外接口为公有的,类内部使用为私有的。8.3.2在类外定义成员函数classStudent{public:voiddisplay();private:intnum;charname[20];charsex;};voidStudent::display(){coutnum:numendl;coutname:nameendl;coutsex:sexendl;}....“::”是作用域限定符。8.3.3inline成员函数classStudent{public:voiddisplay(){coutnum:numendl;coutname:nameendl;coutsex:sexendl;}private:intnum;charname[20];charsex;};8.3.4成员函数的存储方式图8.4图8.5#includeiostreamusingnamespacestd;classTime{public:voidset(){cinhourminutesec;}voiddisplay(){couthour:minute:secendl;}inthour,minute;private:intsec;};....voidmain(){Timet;t.set();t.display();coutsizeof(Time)endl;coutsizeof(t)endl;}3453:4:512128.4对象成员的引用8.4.1通过对象名和成员运算符访问对象中的成员t.set();//“.”是成员运算符8.4.2通过指向对象的指针访问对象中的成员#includeiostreamusingnamespacestd;classTime{public:voidset(){cinhourminutesec;}voiddisplay(){couthour:minute:secendl;}inthour,minute,sec;};voidmain(){Timet,*p;p=&t;p-set();coutp-hourendl;}34538.4.3通过对象的引用来访问对象中的成员Timet1;Time&t2=t1;coutt2.hour;8.5类的封装性和信息隐蔽....8.5.1公用接口和私有实现的分离classStudent{private:intnum;stringname;intage;charsex;public:voiddisplay(){coutnum:numendl;coutname:nameendl;coutage:ageendl;coutsex:sexendl;}};公用成员函数是用户使用类的公用接口。通过成员函数对数据成员进行操作称为类的实现。当接口与实现分离时,只要类的接口没有改变,对私有实现的修改不会影响程序的其它部分。8.5.2类声明和成员函数定义的分离图8.6//student.hclassStudent{public:voidset();voiddisplay();private:intnum;charname[20];intage;charsex;};//student.cpp#includeiostreamusingnamespacestd;#includestudent.hvoidStudent::display(){coutnum:numendl;coutname:nameendl;coutsex:sexendl;}....voidStudent::set(){cinnumnamesex;}#includeiostreamusingnamespacestd;#includestudent.h#includestringvoidmain(){Studentstud;stud.set();stud.display();}1002abcdfnum:1002name:abcdsex:f类库包括两个部分:(1)类声明头文件(成为用户使用类的公用接口)(2)已经编译的成员函数的定义,它是目标文件。包含成员函数定义的文件就是类的实现。8.5.3面向对象程序设计中的几个名词类成员函数在面向对象的理论中被称为“方法”(method),”方法”是指对数据的操作,一个“方法”对应一种操作。外界通过发“消息”来激活有关方法。例如:stud.display();8.6类和对象的简单应用举例例8.1最简单的例子。#includeiostreamusingnamespacestd;classTime{public:inthour;intminute;intsec;};intmain(){Timet1;Time&t2=t1;cint2.hour;cint2.minute;cint1.sec;coutt1.hour:t1.minute:t2.secendl;}12324312:32:43例8.2引用多个对象#includeiostreamusingnamespacestd;classTime{public:....inthour;intminute;intsec;};intmain(){Timet1;cint1.hour;cint1.minute;cint1.sec;coutt1.hour:t1.minute:t1.secendl;Timet2;cint2.hour;cint2.minute;cint2.sec;coutt2.hour:t2.minute:t2.secendl;return0;}10324310:32:4322324322:32:43#includeiostreamusingnamespacestd;classTime{public:inthour;intminute;intsec;};intmain(){voidset_time(Time&);voidshow_time(Time&);Timet1;set_time(t1);show_time(t1);Timet2;set_time(t2);show_time(t2);....return0;}voidset_time(Timet){cint.hour;cint.minute;cint.sec;}voidshow_time(Time&t){coutt.hour:t.minute:t.secendl;}#includeiostreamusingnamespacestd;classTime{public:inthour;intminute;intsec;};intmain(){voidset_time(Time&,inthour=0,intminute=0,intsec=0);voidshow_time(Time&);Timet1;set_time(t1,12,23,34);show_time(t1);Timet2;set_time(t2);show_time(t2);return0;}voidset_time(Time&t,inthour=9,intminute=30,intsec=0){t.hour=hour;t.minute=minute;t.sec=sec;}voidshow_time(Time&t){coutt.hour:t.minute:t.secendl;}12:23:340:0:0例8.3将例8.2的程序改用含成员函数的类来处理。#includeiostreamusingnamespacestd;classTime{public:voidset_time();voidshow_time();private:inthour;intminute;intsec;};....intmain(){Timet1;t1.set_time();t1.show_time();Timet2;t2.set_time();t2.show_time();return0;}voidTime::set_time(){cinhour;cinminute;cinsec;}voidTime::show_time(){couthour:minute:secendl;}12233412:23:343453:4:5例8.4找出一个整型数组中元素最大值。#includeiostreamusingn