1、第9章 类和对象第9章 类和对象本章目的:1、 理解面向对象程序设计的思想;2、 掌握类的声明和对象的定义方法;3、 掌握类成员函数的定义和调用方式以及类成员的引用方法。9.1 引言到目前为止,我们所学习的C+的编程方法都属于面向过程的程序设计,不是真正意义上的C+。这些知识对于解决规模较小的程序,程序设计人员可以将问题转化为若干个模块,通过实现每一个模块完成任务,但是这样的方法对于大规模的程序就显得力不从心了,那么从这次课开始我们就要进入C+的精髓部分面向对象的程序设计。该设计方法就是为解决大规模程序设计中出现的困难而产生的(具体思想详见附件)。9.2 类的声明和对象的定义首先要明确类和对象
2、的关系 类是对象的抽象,对象是类的具体实例(instance); 类是抽象的,不占用内存,而对象是具体的,占用存储空间。在C+中,需要先声明一个类类型,然后再用它去定义若干个同类型的对象。对象就是类类型的一个变量。可以说类是对象的模板,是用来定义对象的一种抽象类型。9.2.1 声明类类型的方法class 类名private: 私有的数据和成员函数; public: 公用的数据和成员函数; protected: 受保护的数据和成员函数;private、 protected、public称为成员访问限定符(member access specifier)。注意:如果在类的定义中不指定限定符,则系统
3、默认为私有的(private)。说明:(1) 用private声明的成员称为私有成员,它只能被类中的成员函数访问,不能被类外访问,但可以被友元类的成员函数访问(后面讲到)。(2) 用protected声明的成员称为受保护成员,它不能被类外访问(这点与私有成员类似),但可以被派生类的成员函数访问(后面讲到)。(3) 用public声明的成员称为公有的成员,它可以被类中的成员函数访问,也可以被类外访问。9.2.2 对比结构体类型struct student int num; char name20; char sex;Student stud1;定义了结构体类型,并定义了结构体变量class st
4、udent int num; char name20; char sex; void display() cout“num:”numendl; cout“name:”nameendl; cout“sex:”sexendl; ;student stud1;定义了类类型,以及类变量。class中 display为成员函数,函数体是具体的操作。从上述可以看出,二者的区别为:(1) 结构体中只有成员变量,没有成员函数,而类中是二者兼有的;(2) 结构体中的成员没有访问限制,即均可通过结构体变量引用,而类成员只有public成员才可通过对象引用。9.2.3 对象的定义与结构体变量定义的方法类似,同样也有
5、三种方法:A. 先声明类类型,再定义对象例如:class student private: public: protected: ;student stud1B. 定义类类型的同时定义对象例如:class student private: public: protected: stud1;C. 不出现类名直接定义对象例如:class private: public: protected: stud1;9.3 类的成员函数9.3.1 成员函数的定义类的成员函数(简称类函数)是函数的一种,它的用法和作用与普通函数基本上是一样的。其定义方式如下:(1) 在类体中定义例如:函数返回值类型 函数名 (参
6、数表)/函数体可以被指定为private(私有的)、public(共有的)或protected(受保护的)(2) 在类外定义例如:函数返回值类型 类名:函数名 (参数表)/函数体在类外定义类函数时,必须在函数名前面加上类名和作用域限定符”:”。例如:class student public: void display(); private: int num; char name20; char sex;void student : display() cout“num:”numendl; cout“name:”nameendl; cout“sex:”sexendl;student stud1;
7、(3) inline成员函数 类的成员函数也可以指定为内置函数。 C+要求对一般的内置函数要用关键字inline声明,但对类内定义的成员函数,可以省略inline。例如:class student public: inline void display(); private: int num; char name20; char sex;inline void student : display() cout“num:”numendl; cout“name:”nameendl; cout“sex:”sexabc; ;coutsizeof(time)endl;答案:129.4 对象成员的引用现在
8、大家来回忆一下对结构体成员的访问方法,其实对于访问对象中的成员,其方法与访问结构体成员类似,可归纳为:(1) 通过对象名和成员运算符访问对象中的成员;(2) 通过指向对象的指针访问对象中的成员;(3) 通过对象的引用变量访问对象中的成员。例9.2 对于如下类和对象的定义class student public: void display(); int num; char name20; char sex;void student : display() cout“num:”numendl; cout“name:”nameendl; cout“sex:”sexnum=1001; 或(*p).nu
9、m=1001;(3) student &stud2=stud1;stud2.num=1001;思考:如果将例9.2中程序做如下修改,上述引用还对吗?为什么?class student public: void display(); private: int num; char name20; char sex;void student : display() cout“num:”numendl; cout“name:”nameendl; cout“sex:”sexendl;student stud1,*p;9.5 类的封装性与信息隐蔽(1) 公用接口与私有实现的分离 如果不必公开的信息,使用:
10、private 要公开的,才使用:public(2) 类声明和成员函数定义的分离 为便于多个程序使用某类,应当把类的声明和成员函数的声明放在头文件中(即.h文件),把成员函数的定义放在另一个文件中(即.cpp文件)。(3) 面向对象程序设计中的几个名词 “方法”(method):“方法”是指对数据的操作(类的成员函数)。一个“方法”对应一种操作。 外界是通过发“消息”来激活有关方法的。 “消息”:其实就是一个命令,由程序语句来实现。 发送“消息”:一个对象通知另一个对象执行它的某条成员函数。 接收“消息”:一个对象接收到另一个对象要求它执行它的某条成员函数的信息。例如对例9.2中的程序段,对象
11、就是stud1,方法即为display(),而stud1.display()是消息例9.3 #include using namespace std;class Timepublic: int hour; int minute; int sec;int main( ) Time t1; cint1.hour; cint1.minute; cint1.sec; coutt1.hour“:“; cout t1.minute“:“; coutt1.sec endl; return 0;例9.4 找出一个整型数组中元素的最大值(用类处理)。/Array_max.h文件class Array_max p
12、ublic: void set_value( ); void max_value( ); void show_value( ); private: int array10; int max; ;/Array_max.cpp文件#include #include Array_max.husing namespace std;void Array_maxset_value( ) int i; for (i=0;iarrayi;void Array_maxmax_value( ) int i; max=array0; for (i=1;imax) max=arrayi;void Array_maxs
13、how_value( ) coutmax=max;/main.cpp文件#include #include Array_max.husing namespace std;int main( ) Array_max arrmax; arrmax.set_value( ); arrmax.max_value( ); arrmax.show_value( ); return 0;例9.5 矩形类。/CRectangle.hclass CRectangle int x, y; public: void set_values (int,int); int area () return (x*y); ;/
14、CRectangle.cpp#include CRectangle.hvoid CRectangle:set_values (int a, int b) x = a; y = b;/main.cpp#include #include CRectangle.husing namespace std;int main () CRectangle rect; rect.set_values (3,4); cout area: rect.area(); return 0;程序运行结果:例9.6 复数类。/Complex.h#include using namespace std;class Compl
15、exprivate: double real,imag;public: void setValue(double, double); double getReal()return real; double getImag()return imag; void display(); Complex conjugate();/main.cpp#include #include Complex.husing namespace std;void main() Complex c,conj; c.setValue(1.1,2.1); cout 实部为: c.getReal() endl; cout 虚
16、部为: c.getImag() endl; conj = c.conjugate(); cout 复数的; c.display(); cout 共轭为:; conj.display(); cout endl;/Complex.cpp#include Complex.hvoid Complex:setValue(double a, double b) real = a; imag = b;void Complex:display() cout 0) cout +; cout imag; cout i;Complex Complex:conjugate() Complex con; con.real = real; con.imag = -1.0 * imag; return con;程序运行结果:
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1