面向对象程序设计—第四.pptx
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《面向对象程序设计—第四.pptx》由会员分享,可在线阅读,更多相关《面向对象程序设计—第四.pptx(96页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、4.1、类和对象1、从结构到类2、类的定义语法3、类中的成员4、对类中成员的访问权限5、对象的定义和引用6、类的作用域第1页/共96页4.1、类和对象1、从结构到类一个类就是一个用户自定义的“数据类型”类是对一组具有相同属性和行为的对象的描述对C语言中的结构体进行了扩展 struct Human int age;void pass_a_year()age+=1;C+提供了一种比结构更加安全有效的数据类型类class第2页/共96页4.1、类和对象2、C类的一般声明语法如下:class 类名private:私有数据成员和成员函数protected:保护数据成员和成员函数public:公有数据成员
2、和成员函数;关键字范围类体声明结束 :可选内容定义外部成员访问类中成员的权限第3页/共96页4.1、类和对象举例:class complex /声明了一个complex类double real;/类中的数据成员double imag;public:/C+内的访问控制符 complex(double r,double i)real=r;imag=i;/类中的成员函数double realcomplex()return imag;第4页/共96页4.1、类和对象3、类中两种类型的成员:数据成员:它们指定了该类对象的内部表示。(通常也称作属性)成员函数:它们指定该类的操作。(通常也称作方法)第5页/
3、共96页4.1、类和对象数据成员的声明方式和一般的变量声明相同(1)类中的数据成员:class Date int year;int month;int day;string today;第6页/共96页4.1、类和对象(a)在类声明中只给出成员函数原型,在类外部进行定义(2)成员函数的定义:两种方式class complex private:double real;double imag;public:complex(double r,double i);double realcomplex();/函数原型的声明;/在类外定义double complex:realcomplex()return
4、 real;第7页/共96页4.1、类和对象(b)成员函数定义在类的内部class complex private:double real;double imag;public:complex(double r,double i);double realcomplex()/成员函数在类的内部定义 return real;第8页/共96页4.1、类和对象公有(public)成员:4、对类中成员的访问权限:三种保护(protected)成员既可以被类内的其他成员访问,也能被类以外的内容(例如函数等)访问私有(private)成员:只能被类内的其他成员访问,而不能被其他内容访问可以由类内的成员访问,
5、以可以由本类的派生类的成员函数访问。第9页/共96页4.1、类和对象数据成员是私有的通常情况:成员函数通常有一部分是公有的,一部分是私有的类的接口第10页/共96页4.1、类和对象类的定义的有关注意事项:(2)类的声明private、protected和public关键字可以按任何顺序出现class pointprivate:int x=0;int y=0;/错误,public:.(1)在类体中不允许对数据成员进行初始化为什么?通过构造函数对对象的数据成员初始化第11页/共96页4.1、类和对象(3)类中的数据成员的类型可以是任意的,包含整型、浮点型、数组、指针等,也可以是对象。不能是自身类的
6、对象,但是自身类的指针和引用是可以的。当一个类的对象作为这个类的成员时,如果另一类的定义在后,需要提前声明。嵌套第12页/共96页4.1、类和对象class N;/提前声明类Nclass Mpublic:.private:class N n;/n是N类的对象;class N public:void f(M m);/m是M类的对象;第13页/共96页4.1、类和对象(4)数据成员可以是任何数据,但不能使用auto、register、和extern等修饰符,只能使用static修饰符;定义的函数也不能使用extern修饰符class Mprivate:register int i;/错误,数据成员
7、不能用register修饰public:extern int func(int a,int b);/错误,不能用extern修饰 .;静态数据成员第14页/共96页4.1、类和对象(5)缺省情况下,类的成员是私有的class complex double real;double imag;/缺省的访问限定符是私有的void init(double r,double i)real=r;imag=i;double realcomplex()return imag;第15页/共96页4.1、类和对象5 对象的定义和引用class point private:int x,y;public:void s
8、etpoint(int,int);/声明setpoint()函数原型int getx();/取x坐标的成员函数int gety();/取y坐标的成员函数 op1,op2;(1)对象的定义:两种方式方法一:在声明类的同时,直接定义对象,即在声明类的右花括号“”的后面,直接写出类的对象名表全局对象第16页/共96页4.1、类和对象class point private:int x,y;public:void setpoint(int,int);/声明setpoint()函数原型int getx();/取x坐标的成员函数int gety();/取y坐标的成员函数;point op1,op2;方法二:
9、声明类后,在使用的时候再定义对象,定义的格式与一般的变量的定义格式相同第17页/共96页4.1、类和对象(2)对象的引用:两种方式一般引用方法:对象名.数据成员名 对象名.成员函数名(参数表)op1.x,op1.y分别表示point类的op1对象的x、y成员使用对象指针引用对象的成员的方法:对象指针名-数据成员名 对象指针名-成员函数名(参数表)point*Ppoint;Ppoint-x,Ppoint-y分别表示point类的op1对象的x、y成员。=&op1;第18页/共96页4.1、类和对象6 类的作用域类的作用域简称类域,每个类都具有类域,该类的成员局部于该类所属的类域中类域内:一个类的
10、成员函数可以不受限制的引用该类的成员类域外:对类成员的引用则要受到一定的限制,有时甚至是不允许。这体现了类的封装功能。第19页/共96页4.1、类和对象class A public:A(int x,int y)X=x;Y=y;int Xcoord()return X;int Ycoord()return Y;void Move(int dx,int dy);private:int X,Y;/私有的数据;int X,Y;/定义在类的外部,是全局变量void A:Move(int dx,int dy)X+=dx;/引用的X是类中的成员 /如果要引用全局的变 量,使用:XY+=dy;类A的作用域类A
11、的类体类A的类体类的声明中用一对花括号括起来的部分第20页/共96页4.1、类和对象总结:软件方法的发展结构化程序设计方法:程序=(算法)+(数据结构)随着结构化程序设计的完善,更注重系统整体关系的表示,把数据结构与算法看作一个独立功能模块:程序=(算法十数据结构)即:算法与数据结构是一个整体 算法只能适用于特定的数据结构第21页/共96页4.1、类和对象面向对象程序设计方法:对象=(算法+数据结构)程序=(对象+对象+)不用为如何实现通盘的程序功能而费尽心机了第22页/共96页4.2、构造函数和析构函数1、构造函数的必要性2、构造函数3、析构函数4、带默认参数的构造函数5、重载构造函数6、拷
12、贝构造函数7、构造函数与析构函数调用的顺序第23页/共96页4.2、构造函数和析构函数1、构造函数的必要性在声明对象时,需要自动地进行:(1)为对象建立存储空间(2)对象能够自动地进行初始化变量初始化:int i=5;结构体变量初始化:struct Date int year;int month;int day;Date date=2008,3,13封装私有只能通过类的成员函数对其初始化 为什么?p58第24页/共96页4.2、构造函数和析构函数2、构造函数定义:一种特殊的成员函数,主要用于对象空间的分配、初始化 初始化的是数据成员,通常为类的私有的成员初始化性质:(1)构造函数的名字必须与类
13、名同名(3)构造函数可以有任何类型的参数,但不能具有返回类型(4)定义对象时,编译系统会自动地调用构造函数 而不能像其他的成员函数那样被显式地调用(2)构造函数被声明为公有函数(5)每个类必须有构造函数,若没有提供则系统提供一个默认的构造函数,只分配空间,不做初始化第25页/共96页4.2、构造函数和析构函数例子:class complex private:double real;double imag;public:complex(double r,double i)real=r;imag=i;complex div_complex(complex c);int main()complex
14、A(1.1,1.2);.return 0;格式为:类名 对象名(实参表)第26页/共96页4.2、构造函数和析构函数3、析构函数定义:也是一种特殊的成员函数,执行与构造函数相反的操作,通常完成一些清理任务,如释放分配给对象的内存空间等性质:(1)析构函数与构造函数的名字相同,只是在它前面加上一个波浪号(3)当撤销对象的时候,编译系统自动调用析构函数(2)析构函数没有参数,也没有返回值,而且不能重载,因此在一个类中只能有一个析构函数什么时候?第27页/共96页4.2、构造函数和析构函数例子:class complex private:double real;double imag;public:
15、complex(double r0.0,double i=0.0)/默认参数构造函数 cout”constructing”endl;real=r;imag=i;complex()/析构函数cout”destructing”endl;第28页/共96页4.2、构造函数和析构函数性质:(4)若没有显式地为一个类定义析构函数,编译系统会自动地生成一个缺省的析构函数例如:编译系统为类complex生成的缺省的析构函数:complex:complex()它为什么是空的?(1)如果完全由系统创立对象的存储空间(2)当构造函数使用了new分配动态存储区时,析构函数用delete释放动态存储空间第29页/共9
16、6页4.2、构造函数和析构函数4、带默认参数的构造函数构造函数可以带参数,目的是创建多样化的对象 P62例4.14注意事项:(1)对象声明时参数类型、数量必须一致(2)下列的使用是错误的:complex A;A(1.1,1.2);第30页/共96页4.2、构造函数和析构函数当构造函数的参数值通常不变,只有在特殊的情况下才需要改变参数值时,可以使用带默认参数的构造函数。class complex private:double real;double imag;public:/带有缺省参数的构造函数complex(double r0.0,double i=0.0)real=r;imag=i;com
17、plex add_complex(complex c);void main()complex A(1.1,1.2);complex B(2.1);complex C();complex D(1.2);real1.1,imag=1.2real2.1,imag=0real0,imag=0左对齐第31页/共96页4.2、构造函数和析构函数5、重载构造函数与一般的成员函数一样,C+允许重载构造函数,以适应不同的场合这些构造函数之间以它们所带的参数的个数和类型的不同而区分class A/public:A();/不带参数的构造函数A(int);/只带一个整型参数的构造参数A(int,char);/带有一个
18、int和char参数的构造函数A(float,char);/带有一个float和char参数的构造函数/;重载和带缺省参数的构造函数时须防止“二义性”:P68第32页/共96页4.2、构造函数和析构函数6、拷贝构造函数拷贝构造函数是一种构造函数拷贝构造函数只有一个参数,并且是对某个对象的引用格式::(const&)在类体中可省略引用另一个对象作用:使用被引用对象来去初始化另外的对象 在这种初始化时:若没有拷贝构造函数,系统会默认一个P69的两个例子类名被引用对象不能被修改第33页/共96页4.2、构造函数和析构函数7、构造函数与析构函数调用的顺序(1)一般情况下,析构函数的调用顺序与构造函数相
19、反#include class A public:A()coutA:Aendl;A()coutA:Aendl;class B public:B()coutB:Bendl;B()coutB:B局部自动(或静态)对象(按执行顺序)由此可见:析构函数调用顺序:局部自动对象-main()执行结束后,静态对象(局部或全局)-全局对象第36页/共96页4.2、构造函数和析构函数举例:演示构造函数、无参数构造函数、带参数的构造函数、拷贝构造函数和析构函数的用法:#include#includeclass Studentprivate:char*name;public:Student()/无参数的构造函数 n
20、ame=new char40;Student(char*pName)/带参数的构造函数 name=new char40;strcpy(name,pName);第37页/共96页4.2、构造函数和析构函数Student(const Student&ss)/拷贝构造函数 name=new char40;strcpy(name,ss.name);void print()/输出对象的值coutnameendl;void setName(char*newname)/改变对象的值 strcpy(name,newname);/析构函数Student()delete name;定义析构函数是必要的第38页/共
21、96页4.2、构造函数和析构函数/主函数int main()Student s(no name);Student s1=s;/在使用s给s1初始化的时候,调用了拷贝构造函数 s.print();s1.print();s.setName(new name);/改变对象的结果 s.print();s1.print();return 0;第39页/共96页4.2、构造函数和析构函数运行结果:定义拷贝构造函数时:no nameno namenew nameno name不定义拷贝构造函数时:no nameno namenew namenew name并且在程序退出的时候出现了 错误!第40页/共96页
22、4.2、构造函数和析构函数分析:内存情况定义拷贝构造函数时不定义拷贝构造函数时第41页/共96页4.2、构造函数和析构函数还有一点说明:本例中可以:Student s;但如果没有不带参数的构造函数则出错为什么?一旦定义了构造函数,则系统不再生成默认构造函数所以:一般情况下,如果显式定义了带参数的构造函数,一般要再定义一个不带参数的构造函数s.print()会显示什么?第42页/共96页第43页/共96页第44页/共96页第45页/共96页4.2、构造函数和析构函数举例:带默认参数的构造函数的用法:#include class complex /声明了一个complex类double real;
23、/类中的数据成员double imag;public:/C+内的访问控制符 complex(double r=0,double i=0)real=r;imag=i;double realcomplex()return imag;int main()complex a();couta.realcomplex();return;第46页/共96页第47页/共96页4.2、构造函数和析构函数举例:构造函数不能显式调用:#include class complex /声明了一个complex类double real;/类中的数据成员double imag;public:/C+内的访问控制符 compl
24、ex()real=0;imag=1;double realcomplex()return imag;int main()complex a;couta.realcomplex()endl;plex();/语法错误return;第48页/共96页第49页/共96页4.2、构造函数和析构函数举例:但析构函数可以显式调用:#include class complex /声明了一个complex类double real;/类中的数据成员double imag;public:/C+内的访问控制符complex()real=0;imag=1;complex()coutrealendl;int main()
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 面向 对象 程序设计 第四
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内