(本科)第6章 面向对象程序设计ppt课件.ppt
《(本科)第6章 面向对象程序设计ppt课件.ppt》由会员分享,可在线阅读,更多相关《(本科)第6章 面向对象程序设计ppt课件.ppt(177页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、课程主讲人:第6章面向对象程序设计C+C+语言程序设计语言程序设计中国铁道出版社中国铁道出版社张思民等主编张思民等主编第 6 章 面向对象程序设计 本章内容本章内容n6.1面向对象的基本概念n6.2类与对象n6.3 构造函数和析构函数n6.4 对象指针和静态类成员n6.5 动态内存分配n 6.6 友元n 6.7 继承与派生n 6.8运算符重载n 6.9 虚函数n 6.10程序设计应用实例n 本章小结6.1 面向对象的基本概念6.1 面向对象的基本概念面向对象的基本概念1 1、 对象的基本概念对象的基本概念 对象是系统中用来描述客观事物的一个实体, 它是构成系统的一个基本单位。 现实世界中的对象
2、有两个共同特征:形态和行为。现实世界中的对象有两个共同特征:形态和行为。 n 图图6.2 6.2 软件对象的变量和方法软件对象的变量和方法 2 2、 类的基本概念类的基本概念 类用class作为它的关键字,例如我们要创建一个汽车类,则可表示为:用类创建对象用类创建对象实例化实例化n 当我们要通过汽车类来创建一个轿车对象,并使用它的刹车行为方法时,则要用下面的格式进行实例化:n /创建汽车对象n 汽车轿车;n /引用汽车对象的刹车函数n 轿车. .刹车( ) ;6.2 类与对象 类是面向对象程序设计的基础和核心,也是实现数据抽象的工具。类中的数据具有隐藏性和封装性,类是实现C+许多高级特性的基础
3、。 6.2.1 类的定义1、类定义的一般形式、类定义的一般形式 类由类声明和类体两部分组成,而类体又由数据成员和成员函数组成。类的组成结构与结构体的组成结构比较如图所示。 类的数据成员和成员函数根据其访问权限分为私有、公有和保护型三种属性。类的一般语法形式如下:类的一般语法形式如下: class 类名 private: ; public: ;protected: ; 类定义的各组成部分说明如下:类定义的各组成部分说明如下:(1)类声明 类声明由class和类名构成。class是定义类的关键字,类名是一种标识符,类名的首字符通常大写。(2)类体 一对大括号“ ”之间的内容称为类体,是类的说明部分
4、,用来说明该类的成员。与结构体类型一样,类的定义要以分号“;”结尾。(3)类的成员类的成员包含数据成员和成员函数两部分。类的成员根据访问权限分为三类:私有成员(private)、公有成员(public)保护型成员(protected)。一个具体的类的组成结构示例:一个具体的类的组成结构示例: 【例【例6-1】一个简单类定义的示例。】一个简单类定义的示例。#include using namespace std; class Test private: /私有成员类外不能够直接访问 int s; public: /共有成员类外能够直接访问 void setSum(int x, int y) s=
5、x+y; void print() coutx+y=sendl; ; void main() Test t; t.setSum(3,8); /公有成员可以外部访问 t.print(); /公有成员可以外部访问 ;结构体与类的比较结构体与类的比较 6.2.2 类的成员函数1、在类体之外定义成员函数为了提高类的可读性,常常把成员函数放在类定义体之外,而类体中只保留成员函数的原型声明。在类体之外定义成员函数称为外联函数外联函数。返回类型 类名 :成员函数名参数表/函数体类区分符类区分符【例【例6-2】使用外联函数编写计算】使用外联函数编写计算1 + 2 + 3 + + 100的程序。的程序。#inc
6、lude using namespace std;class Sum /定义求和类 private: /私有数据成员,类外不能够直接访问 int s; public: /共有成员,类外能够访问 void setSum(int x) ; void print(); ; void Sum:setSum(int x) s=0; for(int i=1; i=x; i+) s=s+i; /加法器加法器 void Sum:print() cout1+2+3+100 = sendl; void main() Sum a; a.setSum(100); /公有成员可以外部访问公有成员可以外部访问 a.pri
7、nt(); /公有成员可以外部访问公有成员可以外部访问 2、内联函数、内联函数n 内联函数是指程序在编译时将函数的代码插入在函数的调用处,作为函数体的内部扩展,以避免函数调用机制所带来的开销,提高程序的执行效率。n 内联函数有两种定义方法,一种方法是在类体内定义成员函数,另一种方法是使用inline关键字。6.2.3 对象 类和对象的关系相当于普通数据类型与其变量的关系。类是一种逻辑抽象概念,声明一个类只是定义了一种新的数据类型,对象说明才真正创建了这种数据类型的物理实体。由同一个类创建的各个对象具有完全相同的数据结构,但它们的数据值可能不同。 1、对象的创建、对象的创建定义一个类的对象很简单
8、,与声明普通数据类型的变量相同,其格式如下:其格式如下:类名类名 对象名;对象名;当声明同一个类的多个对象时,多个对象之间用逗号分隔。例如,在【例6-2】的主函数文件 t6-2.cpp中,定义类Sum的对象a为: Sum a; 2、类成员的访问、类成员的访问 对于类成员的访问,如果在该类的内部访问类成员,只要指出它的名字就可以直接使用。如果在类的外部使用类成员,则要通过类的对象来访问其公有成员。一旦创建了一个类的对象,程序就可以用成员运算符“.”来访问类的公有成员,其一般形式为: 对象名公有数据成员名; 或 对象名公有成员函数名(实参表) ;注意:注意: 只有用public定义的公有成员才能使
9、用成员运算符“.”访问,对象中的私有成员是类中隐藏的数据,不允许在类外的程序中被直接访问,只能通过该类的公有成员函数来访问它们。 在【例6-2】中,定义类Sum的对象a,通过对象a完成对成员函数setSum ( )的调用: Sum a; a.setSum(100); 【例【例6-3】创建一个圆面积类,计算圆的面积。】创建一个圆面积类,计算圆的面积。#include using namespace std; #define PI 3.24159 class Circle private: /私有成员不能够直接访问 double radius; public: /共有成员类外能够直接访问 void
10、 setRadius(double r); double cirArea(); void Circle : setRadius(double r) radius = r; ; double Circle : cirArea() double area = 0;area = PI * radius * radius;return area; ; void main() double s, r = 3;Circle cir; /定义对象定义对象cir cir.setRadius(r); /公有成员可以外部访问公有成员可以外部访问 s = cir.cirArea(); /公有成员可以外部访问公有成员
11、可以外部访问cout 圆的面积圆的面积 = s endl;3、对象指针访问类成员、对象指针访问类成员n 一个类在声明之初,系统并没有为其分配内存空间,只有当创建了类对象之后,系统才为类对象分配内存空间。因此,可以用一个指针指向对象的首地址。n 如果一个指针指向了一个对象,则可以通过该指针来访问它所指向的对象成员。n 对象指针的成员表示方法如下:对象指针名公有数据成员名; 或 对象指针名公有成员函数名(实参表) ;以下两种表示方法是等价的:对象指针名公有数据成员名;(*对象指针名)公有数据成员名;【例【例6-4】对象指针的应用示例,计算圆的面积。】对象指针的应用示例,计算圆的面积。#includ
12、e using namespace std; #define PI 3.14class Circle private: double radius; public: double setRadius(int r);double Circle : setRadius(int r) radius = r ; cout 经参数传递,圆的半径设为: radius setRadius(8); cout 圆的面积为: s endl;6.3构造函数和析构函数n C+在类说明中引进了构造函数,构造函数在对象被创建时自动调用,对象所要执行的所有初始化工作都由构造函数自动完成。 n 与构造函数相对应的是析构函数。
13、创建一个对象时,需要给该对象分配内存空间;当这个对象使用完后,就应释放这些空间。析构函数完成当一个对象使用结束时所要进行的清理工作,当一个对象消失时,析构函数被自动调用,释放被对象占用的资源。 构造函数构造函数n构造函数是在类中声明的一种特殊的成员函数,作用是在对象被创建时使用特定的值构造对象,将对象初始化为一个特定的状态。 n构造函数定义规则:构造函数定义规则:构造函数的名字必须与其所属的类名相同,并声明为公有成员函数,且没有任何类型的返回值。构造函数可以访问类的所有数据成员,可以是内联函数,可以带有参数,还可以带默认的形参值。构造函数也可以重载,以提供初始化类对象的不同方法。 n构造函数在
14、创建对象时将被自动调用。【例【例6-5】计算圆的面积,要求使用构造函数。】计算圆的面积,要求使用构造函数。#include using namespace std; #define PI 3.14class Circle private: double radius; /半径半径 public: Circle(); /定义构造函数定义构造函数 double area() ; /定义一般函数定义一般函数;Circle:Circle() radius = 8; cout 构造函数被调用构造函数被调用,圆的半径设为圆的半径设为8 endl; double Circle:area() double s
15、 = PI*radius*radius ;return s; void main() Circle cir; /构造函数在声明对象时自动调构造函数在声明对象时自动调用用 double s = cir.area(); cout 圆的面积为:圆的面积为: s endl;【例【例6-6】带参构造函数与不带参数的构造函数的定义和使用示例。】带参构造函数与不带参数的构造函数的定义和使用示例。class Sumprivate: int num;public:Sum(); /构造函数构造函数Sum(int a, int b); /带参数的构造函数带参数的构造函数void prnt(); /成员函数成员函数
16、;Sum:Sum()num=15; cout调用默认的构造函数,调用默认的构造函数,num=numendl;Sum:Sum(int a, int b)num=a+b; cout调用带参数构造函数计算调用带参数构造函数计算a+b=numendl;void Sum:prnt() cout调用一般成员函数调用一般成员函数endl;void main()Sum s; Sum(); Sum(3,5); s.prnt();重载构造函数class Tdate public: Tdate(); Tdate(int d); Tdate(int m,int d); Tdate(int m,int d,int y)
17、; protected: int month; int day; int year; ; 【例6-7】重载构造函数,下面的日期类同时声明了四个构造函数。Tdate:Tdate() year = 2010; month = 4; day = 15 ;cout year / month / day endl; Tdate:Tdate(int d) year = 2010; month = 4;day = d; cout year / month / day endl; Tdate:Tdate(int m, int d) year=2010; month=m;day=d; cout year / m
18、onth / day endl; Tdate:Tdate(int m, int d, int y) year = y; month = m;day = d; cout year / month / day endl; void main() Tdate aday; Tdate bday(10); Tdate cday(2, 12); Tdate dday(10, 1, 2010); 6.3.3 析构函数n 析构函数同构造函数一样,也是特殊的类成员函数,它的主要作用是在类对象生命期结束时,清理和释放类对象所占用的系统资源。n 析构函数与所属的类同名,其函数名前加一个逻辑非运算符“”,表示构造函数
19、的逆。一个类中只可以定义一个析构函数。【例【例6-8】析构函数应用示例。】析构函数应用示例。class Sumprivate: int num;public:Sum(); /构造函数构造函数void prnt(); /成员函数成员函数Sum(); /析构函数析构函数 ;Sum:Sum()num=15; cout调用默认的构造函数,调用默认的构造函数,num=numendl;Sum:Sum()cout 析构函数被调用析构函数被调用 endl; void Sum:prnt() cout调用一般成员函数调用一般成员函数endl;void main()Sum s; s.prnt();通过上述例子,可以
20、看到构造函数有如下特点:通过上述例子,可以看到构造函数有如下特点:(1)析构函数与构造函数名字相同,但它前面必须加一个“”号。(2)析构函数不具有返回类型,同时不能有参数,也不能重载,一个类 只能 拥有一个析构函数,这与构造函数不同。(3)析构函数不能显式调用,它在类的生命期结束时会被系统自动调用。(4)C+语言规定,任何一个类都必须有析构函数。如果没有定义析构函数,则系统会提供一个默认的析构函数,该默认的析构函数没有任何具体操作。只要类中提供了一个显式的析构函数,那么系统就不再自动提供默认析构函数。【例【例6-9】定义多个重载的构造函数和析构函数,考察析构函数的调用顺序。】定义多个重载的构造
21、函数和析构函数,考察析构函数的调用顺序。class Tdate public: Tdate(); Tdate(int d); Tdate(int m,int d); Tdate(int m,int d,int y); Tdate(); protected: int month; int day; int year; int x; Tdate:Tdate() x = 1;year = 2010; month = 4; day = 15 ;cout year / month / day endl; Tdate:Tdate(int d) x = 2; year = 2010; month = 4;d
22、ay = d; cout year / month / day endl; Tdate:Tdate(int m, int d) x = 3;year=2010; month=m;day=d; cout year / month / day endl; Tdate:Tdate(int m, int d, int y) x = 4;year = y; month = m;day = d; cout year / month / day endl; Tdate:Tdate() cout 析构函数d x endl;void main() Tdate d1; Tdate d2(10); Tdate d3
23、(2, 12); Tdate d4(10, 1, 2010); 2010/4/152010/4/102010/2/122010/10/1析构函数d4析构函数d3析构函数d2析构函数d1拷贝构造函数n 拷贝初始化构造函数是一种特殊的构造函数,具有一般构造函数的所有特性,它在创建新的对象时才被调用,但其形参是本类的对象的引用,其作用是用一个存在的对象来初始化另一个正创建的同类的对象,将一个已知对象的数据成员的值拷贝给正在创建的另一个同类的对象。n 拷贝构造函数的特点如下。 (1)该函数名与类名相同,因为它也是一种构造函数, 并且该函数不被指定返回类型。 (2)该函数只有一个参数,并且是对某个对象的
24、引用。 (3)每个类都必须有一个拷贝初始化构造函数。拷贝构造函数的一般形式为:拷贝构造函数的一般形式为:class 类名类名 public: 类名类名(类名类名 &对象名对象名); ;类名类名 :类名:类名(类名类名 &对象名对象名) ; 【例【例6-10】拷贝初始化构造函数应用举例。】拷贝初始化构造函数应用举例。 class TPoint private: int x, y; public: TPoint(int a, int b) x = a; y = b; TPoint(TPoint &p); TPoint() cout析构函数被调用。n; int Xcoord() return x;
25、int Ycoord() return y; ;TPoint:TPoint(TPoint &p) x = 2 * p.x; y = 2 * p.y; cout拷贝构造函数被调用。拷贝构造函数被调用。n; void main() TPoint P1(5, 7); TPoint P2(P1); cout P2 = P2.Xcoord() , P2.Ycoord() ”运算符,一般格式为:一般格式为: 对象指针名 - 类成员名 ;或: (*对象指针名).类成员名;【例【例6-11】处理平面上点的坐标。】处理平面上点的坐标。算法分析:算法分析:设平面上点的坐标为P(x, y),创建一个点的坐标类Poi
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 本科 面向 对象 程序设计 ppt 课件
限制150内