CPP程序设计:类和对象(一).ppt_第1页
CPP程序设计:类和对象(一).ppt_第2页
CPP程序设计:类和对象(一).ppt_第3页
CPP程序设计:类和对象(一).ppt_第4页
CPP程序设计:类和对象(一).ppt_第5页
已阅读5页,还剩50页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、C+程序设计,第6讲 类和对象(一),面向对象的程序设计,THE C+ PROGRAMMING LANGUAGE,THE C+ PROGRAMMING LANGUAGE,THE C+ PROGRAMMING LANGUAGE,第6章 类和对象(一),THE C+ PROGRAMMING LANGUAGE,6.1 类的定义格式和对象的定义方法,对象是现实世界的实体,是由一组状态和行为组成的集合。 面向对象的方法:把问题看作成由许多彼此互相联系的对象组成。 面向对象的程序设计OOP:Object Oriented Programming; 把数据和函数封装在称为对象的包中,公布对象的接口,而将实现

2、的细节隐蔽起来。,THE C+ PROGRAMMING LANGUAGE,6.1 类的定义格式和对象的定义方法,例1:图书馆 状态:共有多少类图书;每类图书有多少册;读者人数;馆内库存有多少本;正在阅读的有多少本;外借多少本; 行为:办图书证;图书检索;阅览室阅读;外借阅读; 例2:学校 状态:总人数;教师人数;本科生人数;研究生人数;科研成果; 行为:招生;毕业;授课;实验;考试;科研;,对象是现实世界的实体,是由一组状态和行为组成的集合,THE C+ PROGRAMMING LANGUAGE,6.1 类的定义格式和对象的定义方法,例:学校管理 学校管理工作: 学籍管理、教务管理、教师管理、

3、住宿管理、伙食管理、科研管理、 学籍管理:入学、成绩、奖惩、毕业 教务管理:课程设置、排课、质量监督 住宿管理:宿舍安排、打扫卫生、安全保卫 伙食管理:饭卡管理、承包管理、卫生监督 科研管理:项目申请、设备采购、项目鉴定 作为校长不必每件事都去具体管理,他只要设置一些部门去管理就行了。这些部门就是对象!,面向对象的方法:把问题看作成由许多彼此互相联系的对象组成,THE C+ PROGRAMMING LANGUAGE,6.1 类的定义格式和对象的定义方法,结构的定义 struct Date int year, month, day; ; Date就是一个数据类型 Date d=1980,8,23

4、; / 结构的初始化 Date *pd,date31; / 结构指针和数组 访问结构的成员 cout d.year; 用结构实现用户定义的类型 可读性差,可维护性差。,THE C+ PROGRAMMING LANGUAGE,6.1 类的定义格式和对象的定义方法,类的定义 : 说明部分 class Date public: void SetDate(int y,int m,int d); int IsLeapYear(); void Print(); private: int year, month, day; ;,用class定义一个类,公有成员:内部和外部都可以访问,私有成员:内部可以访问,

5、但外部不能访问,成员函数,数据成员,类声明以分号结束,类还有protected(受保护成员),与私有成员相同,但可以被继承。,THE C+ PROGRAMMING LANGUAGE,6.1 类的定义格式和对象的定义方法,类的定义 : 实现部分 void Date:SetDate(int y,int m,int d) year=y; month=m; day=d; int Date:IsLeapYear() return year%4=0 ,表示类的成员函数,给数据成员赋值,与普通函数一样,成员函数的说明与实现必须一致!,THE C+ PROGRAMMING LANGUAGE,6.1 类的定义格

6、式和对象的定义方法,成员函数可以定义在类体内 class Date public: void SetDate(int y,int m,int d) year=y; month=m; day=d; int IsLeapYear() return year%4=0,相当于内联函数,THE C+ PROGRAMMING LANGUAGE,6.1 类的定义格式和对象的定义方法,对象的定义方法 先定义类类型 Date d1,d2,*pd,date31; Date d1,类的对象,对象的指针,对象数组,对象的引用,这个时候类名可以省略,类的用法与数据类型类似!,THE C+ PROGRAMMING LAN

7、GUAGE,6.1 类的定义格式和对象的定义方法,对象成员的表示 一般对象的成员表示用运算符“.”。 Date d1; d1.year, d1.month, d1.SetDate(2005,6,24); 指向对象指针的成员表示用运算符“-”。 Date d1,*pd= 对象数组元素的成员表示同一般对象,THE C+ PROGRAMMING LANGUAGE,THE C+ PROGRAMMING LANGUAGE,程序输出: 0, 1 2005/6/24 2000/2/8,THE C+ PROGRAMMING LANGUAGE,6.1 类的定义格式和对象的定义方法,【例6.1】分析下列程序的输出

8、结果,熟悉对象的定义和成员的表示。 #include void main( ) Date d1,d2,*pd= ,两个对象d1和d2,对象指针,指向d2,即对d2赋值,THE C+ PROGRAMMING LANGUAGE,THE C+ PROGRAMMING LANGUAGE,THE C+ PROGRAMMING LANGUAGE,第6章 类和对象(一),THE C+ PROGRAMMING LANGUAGE,6.2 对象的初始化,构造函数的功能、种类和特点 构造函数的功能 构造函数的主要功能就是用来初始化对象。(由程序员完成,理论上可放任何代码,初始化对象只是建议) 构造函数的特点 构造函

9、数的名字同类名。 说明或定义构造函数时不必指出类型,也无任何返回值。 构造函数是系统在创建对象时自动调用的。 构造函数可以被重载。(多个不同的构造函数),THE C+ PROGRAMMING LANGUAGE,6.2 对象的初始化,构造函数的功能、种类和特点 class Date public: Date(); ; 构造函数的种类 默认构造函数 这种构造函数的特点是不带参数。 默认构造函数用户可以定义。如果在一个类体中,用户没有定义任何构造函数时,系统会自动创建一个默认的构造函数。,THE C+ PROGRAMMING LANGUAGE,6.2 对象的初始化,构造函数的功能、种类和特点 带参数

10、的构造函数 构造函数可以带有一个或者多个参数。 class Date public: Date(int y,int m, int d); ; 拷贝构造函数 拷贝构造函数是用来使用已知对象给所创建对象进行初始化时所用的构造函数。 class Date public: Date(Date,有了此种构造函数,则系统不再自动创建默认构造函数,THE C+ PROGRAMMING LANGUAGE,6.2 对象的初始化,析构函数的功能和特点 析构函数的功能正好与构造函数相反,它是用来释放所创建的对象的。一个对象在它的寿命结束时,系统将会自动调用析构函数将它释放掉。 class Date public:

11、Date(); ; 析构函数的特点 析构函数名同类名,在析构函数名前加“”符号。 析构函数定义时不必给出类型,也无返回值,并且无参数。 析构函数是由系统自动调用。,与构造函数相比,析构函数唯一,并不能有任何参数!,THE C+ PROGRAMMING LANGUAGE,6.2 对象的初始化,【例6.2】分析下列程序的输出结果,熟悉构造函数和析构函数的定义和用法。 #include class Date1 public: Date1(int,int,int); Date1() coutDefault constructor called.n; Date1() coutDestructor cal

12、led.tdayendl; void Print(); private: int year, month, day; ;,带参数的构造函数,默认的构造函数,析构函数,THE C+ PROGRAMMING LANGUAGE,THE C+ PROGRAMMING LANGUAGE,程序输出: Default constructor called. Constructor called. d1 is 0/0/0 d2 is 2005/6/25 Destructor called. 25 Destructor called. 0,THE C+ PROGRAMMING LANGUAGE,6.2 对象的初

13、始化,Date1:Date1(int y,int m,int d) year = y; month = m; day = d; cout “Constructor called.“n”; void Date1:Print() coutyear/month/dayendl; void main( ) static Date1 d1; Date1 d2(2005,6,25); coutd1 is ; d1.Print(); coutd2 is ; d2.Print(); ,调用默认构造函数,调用带参数的构造函数,结束时调用析构函数 static对象析构函数最后被调用,THE C+ PROGRAMM

14、ING LANGUAGE,6.2 对象的初始化,【例6.3】分析下列程序的输出结果,熟悉拷贝构造函数的用法及对象赋值的含义。 #include class Point public: Point(int i,int j) X=i; Y=j; Point(Point ,带参数的构造函数,拷贝构造函数,析构函数,THE C+ PROGRAMMING LANGUAGE,THE C+ PROGRAMMING LANGUAGE,THE C+ PROGRAMMING LANGUAGE,6.2 对象的初始化,Point:Point(Point ,逐个元素拷贝,p2(p1)和p3=p2都是调用拷贝构造函数,但

15、p4=p1调用的是运算符= 因为此时已经不是构造的时候了,程序输出: Copy Constructor called. Copy Constructor called. p3=(6,9) p4=(6,9) Destructor called. Destructor called. Destructor called. Destructor called.,THE C+ PROGRAMMING LANGUAGE,THE C+ PROGRAMMING LANGUAGE,THE C+ PROGRAMMING LANGUAGE,第6章 类和对象(一),THE C+ PROGRAMMING LANGUA

16、GE,6.3 数据成员的类型和成员函数的特性,成员函数可以重载 【例6.3】分析下列程序的输出结果,熟悉成员函数重载的用法。 #include class AB public: AB(int i,int j) a=i; b=j; AB(int i) a=i; b=i*i; int Add(int x,int y); int Add(int x); int Add(); int aout() return a; int bout() return b; private: int a,b; ;,Add():成员函数重载,构造函数重载,THE C+ PROGRAMMING LANGUAGE,THE

17、C+ PROGRAMMING LANGUAGE,程序输出: a=5,8 b=7,49 13 8 12,THE C+ PROGRAMMING LANGUAGE,6.3 数据成员的类型和成员函数的特性,int AB:Add(int x, int y) a=x;b=y;return a+b; int AB:Add(int x) a = b = x;return a+b; int AB:Add() return a+b; void main() AB a(5,8),b(7); couta=a.aout(),a.bout()endl; coutb=b.aout(),b.bout()endl; int i

18、=a.Add(); int j=a.Add(4); int k=b.Add(3,9); coutiendljendlkendl; ,执行不同的构造函数,调用不同的Add()函数,THE C+ PROGRAMMING LANGUAGE,6.3 数据成员的类型和成员函数的特性,成员函数被说明为内联函数 【例6.5】分析下列程序的输出结果,熟悉内联函数的定义方法。 #include class M public: M(int i,int j) a=i; b=j; int fun1() return a; int fun2() return b; int fun3(),fun4(); private:

19、 int a,b; ;,这是内联函数,THE C+ PROGRAMMING LANGUAGE,THE C+ PROGRAMMING LANGUAGE,程序输出: 13,THE C+ PROGRAMMING LANGUAGE,6.3 数据成员的类型和成员函数的特性,inline int M:fun3() return fun1()+fun2(); inline int M:fun4() return fun3(); void main() M m(5,8); int n = m.fun4(); cout n endl; ,调用内联函数,这也是内联函数,THE C+ PROGRAMMING LAN

20、GUAGE,6.3 数据成员的类型和成员函数的特性,【例6. 6】分析下列程序的输出结果,熟悉给成员函数设置默认参数的用法。 #include class A public: A(int i=8,int j=10,int k=12); int aout() return a; int bout() return b; int cout() return c; private: int a,b,c; ;,带默认参数的构造函数,THE C+ PROGRAMMING LANGUAGE,THE C+ PROGRAMMING LANGUAGE,THE C+ PROGRAMMING LANGUAGE,6.

21、3 数据成员的类型和成员函数的特性,A:A(int i,int j,int k) a=i; b=j; c=k; void main() A X, Y(5),Z(7,9,11); coutX=X.aout(),X.bout(),X.cout()endl; coutY=Y.aout(),Y.bout(),Y.cout()endl; coutZ=Z.aout(),Z.bout(),Z.cout()endl; ,a=8 b=10 c=12,程序输出: X=8,10,12 Y=5,10,12 Z=7,9,11,a=5 b=10 c=12,a=7 b=9 c=11,THE C+ PROGRAMMING L

22、ANGUAGE,THE C+ PROGRAMMING LANGUAGE,THE C+ PROGRAMMING LANGUAGE,第6章 类和对象(一),THE C+ PROGRAMMING LANGUAGE,6.4 静态成员,静态数据成员 在类体内使用关键字static说明的成员称为静态成员。静态成员包括静态数据成员和静态成员函数两种。 静态成员的特点是它不是属于某对象的,而是属于整个类的,即所有对象的。 class A public: A(int i); private: int a; static int b; ; int A:b = 10; ,在对象产生之前就已经存在了! 具有文件生命期

23、。,因此必须在对象之外初始化。,THE C+ PROGRAMMING LANGUAGE,6.4 静态成员,静态数据成员的特点 静态数据成员不是属于某个对象,而是属于整个类的。 静态数据成员具有共享性和唯一性 静态数据成员不随对象的创建而分配内存空间,它也不随对象被释放而撤销。只有在程序结束时才被系统释放。 静态数据成员具有文件生命期 静态数据成员只能在类体外被初始化。 静态数据成员必须初始化。,THE C+ PROGRAMMING LANGUAGE,6.4 静态成员,【例6. 7】分析下列程序的输出结果,了解静态数据成员的使用方法。 #include class MY public: MY(i

24、nt i,int j,int k); void PrintNumber(); int GetSum(MY m); private: int a,b,c; static int s; ; int MY:s = 0; MY:MY(int i,int j,int k) a=i; b=j; c=k;s=a+b+c; ,静态数据成员,静态数据成员类体外初始化,静态数据成员被赋值,THE C+ PROGRAMMING LANGUAGE,THE C+ PROGRAMMING LANGUAGE,THE C+ PROGRAMMING LANGUAGE,6.3 数据成员的类型和成员函数的特性,void MY:Pr

25、intNumber() cout a , b , c endl; int MY:GetSum(MY m) return MY:s; void main() MY m1(2,3,4),m2(5,6,7); m2.PrintNumber(); coutm1.GetSum(m1),m2.GetSum(m2)endl; ,程序输出: 5,6,7 18,18,s是私有成员,不能直接访问,证明s的唯一性,THE C+ PROGRAMMING LANGUAGE,6.4 静态成员,静态成员函数 静态成员函数的实现可放在类体内,也可以放在类体外。 在静态成员函数中可以直接引用其静态成员,而引用非静态成员时需用对

26、象名引用。 class A public: A(int i); private: int funa(); static int funb(); ; int A:b = 10; ,在对象产生之前就已经存在了! 具有文件生命期。,因此必须在对象之外初始化。,THE C+ PROGRAMMING LANGUAGE,6.4 静态成员,静态数据成员的特点 静态数据成员不是属于某个对象,而是属于整个类的。 静态数据成员具有共享性和唯一性 静态数据成员不随对象的创建而分配内存空间,它也不随对象被释放而撤销。只有在程序结束时才被系统释放。 静态数据成员具有文件生命期 静态数据成员只能在类体外被初始化。 静态数

27、据成员必须初始化。,THE C+ PROGRAMMING LANGUAGE,6.4 静态成员,【例6. 8】分析下列程序的输出结果,学会静态成员函数的用法。 #include #include class Student public: Student(char name1,int sco) strcpy(name,name1); score=sco; void total() sum+=score; count+; static double aver() return (double)Student.sum/Student.count; private: char name20; int

28、score; static int sum, count; ;,静态数据成员,静态成员函数,只能访问静态数据成员,THE C+ PROGRAMMING LANGUAGE,THE C+ PROGRAMMING LANGUAGE,THE C+ PROGRAMMING LANGUAGE,6.4 静态成员,int Student:sum=0; int Student:count=0; void main() Student stu5 =Student(Ma,89),Student(Hu,90),Student(LU,95), Student(Li,88),Student(Gao,75); for(in

29、t i=0;i5;i+) stui.total(); coutAverage=Student:aver()endl; ,程序输出: Average=87.4,对象数组,虽然有5个对象,但aver()是唯一的。,静态数据成员初始化,THE C+ PROGRAMMING LANGUAGE,THE C+ PROGRAMMING LANGUAGE,THE C+ PROGRAMMING LANGUAGE,第6章 类和对象(一),THE C+ PROGRAMMING LANGUAGE,6.5 常成员,常数据成员 常数据成员即只读变量。 常数据成员初始化是通过采用构造函数的成员初始列表来实现的。 class

30、 A public: A(int i, int j): a(i) b = j; private: const int a; int b; ; ,这个称为初始化列表 const变量只能这样初始化!,THE C+ PROGRAMMING LANGUAGE,6.5 常成员,【例6. 9】分析下列程序的输出结果,学会常数据成员的用法。 #include #include class A public: A(int i); void Print() couta,b,rendl; const int A:A(int i):a(i),r(a) ,常数据成员,常数据成员及引用初始化,静态的常数据成员,void

31、 main() A a1(10),a2(20); a1.Print(); a2.Print(); ,常数据成员的引用,程序输出: 10,15,10 20,25,20,THE C+ PROGRAMMING LANGUAGE,6.5 常成员,常成员函数 常成员函数保证不修改任何外部变量。 常成员函数可以引用任何数据成员,但不可改变外部的变量。 只能调用常函数。 class B public: B(int i, int j) b1 = i; b2 = j; void Print() cout b1 ; b2 endl; void Print() const cout b1 : b2 endl; pr

32、ivate: int b1,b2; ; ,常函数!只有当常对象时调用,void main() B b1(5,10); b1.Print(); const B b2(2,8); b2.Print(); ,程序输出: 5;10 2:8,THE C+ PROGRAMMING LANGUAGE,6.5 常成员,【例6. 10】分析下列程序的输出结果,熟悉常成员函数的用法。 #include #include class Student public: Student(char name1,int sco) strcpy(name,name1); score=sco; void total() sum+

33、=score; count+; static double aver() return (double)Student.sum/Student.count; private: char name20; int score; static int sum, count; ;,静态数据成员,静态成员函数,只能访问静态数据成员,THE C+ PROGRAMMING LANGUAGE,THE C+ PROGRAMMING LANGUAGE,THE C+ PROGRAMMING LANGUAGE,6.5 常成员,int Student:sum=0; int Student:count=0; void m

34、ain() Student stu5 =Student(Ma,89),Student(Hu,90),Student(LU,95), Student(Li,88),Student(Gao,75); for(int i=0;i5;i+) stui.total(); coutAverage=Student:aver()endl; ,程序输出: Average=87.4,对象数组,虽然有5个对象,但aver()是唯一的。,静态数据成员初始化,THE C+ PROGRAMMING LANGUAGE,THE C+ PROGRAMMING LANGUAGE,THE C+ PROGRAMMING LANGUA

35、GE,第6章 类和对象(一),THE C+ PROGRAMMING LANGUAGE,6.6 友元函数和友元类,友元函数 友元函数是说明在类体内的一般函数,它不是这个类中的成员函数,但是它访问该类所有成员。 友元函数举例如下(例6.11): class Point public: Point(double i,double j) x=i;y=j; void Print() cout(x,y)endl; friend double Distance(Point a,Point b); private: double x,y; ; double Distance(Point a,Point b)

36、double dx=a.x-b.x; double dy=a.y-b.y; return sqrt(dx*dx+dy*dy); ,友元函数的说明,友元函数的实现 可访问Point中私有成员,不加类名,因为不是类Point的成员,THE C+ PROGRAMMING LANGUAGE,6.6 友元函数和友元类,void main double d1=3, d2=4, d3=6, d4=8; Point p1(d1,d2), p2(d3,d4); p1.Print(); p2.Print(); double d = Distance(p1,p2); cout “Distance=“ d endl;

37、 ,友元函数与普通函数的调用方式相同,思考: 在程序中去掉Distance()函数前的friend关键字后,调试该程序会出现什么现象? 将友元函数的定义在类体内,会出现什么现象?,THE C+ PROGRAMMING LANGUAGE,6.6 友元函数和友元类,友元类 将一个类作为另一个类的友元,则该类称为友元类。友元类中的所有成员函数都是这个类的友元函数。 class A friend class B; public: A(int i, int j): a(i) b = j; private: const int a; int b; ; ,class B中任何函数可不受限制的访问class A中任何元素。,THE C+ PROGRAMMING LANGUAGE,6.6 友元函数和友元类,【例6. 12】分析下列程序的输出结果,熟悉友元类的用法。 #include class X friend class Y; public: X(int i) x=i; void Print() coutx=x,s=sendl; private: int x; static int s; ;,友元类,THE C+ PROGRAMMING LANGUAGE,6.6 友元函数和友元类,int X:s=5; class Y

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论