面向对象程序设计语言C第章深入类与对象课件

PPT
  • 阅读 40 次
  • 下载 0 次
  • 页数 61 页
  • 大小 887.512 KB
  • 2022-11-24 上传
  • 收藏
  • 违规举报
  • © 版权认领
下载文档30.00 元 加入VIP免费下载
此文档由【小橙橙】提供上传,收益归文档提供者,本网站只提供存储服务。若此文档侵犯了您的版权,欢迎进行违规举报版权认领
面向对象程序设计语言C第章深入类与对象课件
可在后台配置第一页与第二页中间广告代码
面向对象程序设计语言C第章深入类与对象课件
可在后台配置第二页与第三页中间广告代码
面向对象程序设计语言C第章深入类与对象课件
可在后台配置第三页与第四页中间广告代码
面向对象程序设计语言C第章深入类与对象课件
面向对象程序设计语言C第章深入类与对象课件
还剩10页未读,继续阅读
【这是免费文档,您可以免费阅读】
/ 61
  • 收藏
  • 违规举报
  • © 版权认领
下载文档30.00 元 加入VIP免费下载
文本内容

【文档说明】面向对象程序设计语言C第章深入类与对象课件.ppt,共(61)页,887.512 KB,由小橙橙上传

转载请保留链接:https://www.ichengzhen.cn/view-44680.html

以下为本文档部分文字说明:

面向对象程序设计语言C++电子科技大学计算机学院1第四章深入类和对象•4.1构造函数4.1.1构造函数的作用classDate{intday,month,year;public:voidInitDate(intd,i

ntm,inty);//初始化??…};程序员有的时候会忘记了调用初始化函数或者调用了多次。这都是不好的现象。2第四章深入类和对象•4.1构造函数4.1.1构造函数的作用C++为类设计了构造函数(constructor)机制,它可以达到初始化数据成员的目的。类的构造函数是类的一个特殊成员函数,它

没有返回类型(void也不行),可以有参数,函数名和类名一样。当创建类的一个新对象时,自动调用构造函数,完成初始化工作(需要注意构造函数是否有参数,以及参数的个数、类型)。3第四章深入类和对象•4.1构造函数4.1.1构造函数的作用构造函数的作用为:(1)分配一个对象的数据成员的存储空间;

(该功能由系统自动完成。)(2)执行构造函数(体),一般是初始化一个对象的部分或全体数据成员。4第四章深入类和对象•4.1构造函数4.1.2构造函数的定义1.构造函数的定义classDate{private:intyear

,month,day;public:Date(inty,intm,intd);…//其它成员};构造函数的参数可以是缺省的。5第四章深入类和对象•4.1构造函数4.1.2构造函数的定义2.构造函数的初始

化方式构造函数有两种方式初始化数据成员:1)在构造函数体内用赋值语句的方式;Date::Date(inty,intm,intd){year=y;month=m;day=d;}6第四章深入类和对象•4.1构造函数4.1.2构造函数的定义2)构造函数的初始化列表的方式Date::Dat

e(inty,intm,intd):year(y),month(m),day(d){}7第四章深入类和对象•4.1构造函数4.1.2构造函数的定义3.缺省的构造函数用户定义的类类型中,可以没有构造函数。编译器会自动给该类类型生成

一个没有参数的构造函数,该函数不作任何初始化工作。这种构造函数称为缺省的构造函数。注意:一个类如果有显式定义的构造函数,编译器就不会生成缺省构造函数了。8第四章深入类和对象•4.1构造函数4.1.2构造函数的定义4.定义类

对象时给构造函数提供参数1)仅仅只有一个参数:类名对象名=参数;2)有一个或多个参数:类名对象名(参数列表);9第四章深入类和对象•4.1构造函数4.1.3重载构造函数一个类可以提供多个构造函数,用于在不同场合进行类对象的初始化工作。构造函数的重载,它们的参数表必须互不相同。cl

assDate{intyear,month,day;public:Date(intd,intm,inty);Date(intd,intm);Date(intd);Date();Date(constchar*dateStr);…};10则下述定义对象的方式都是正确的。Date

today(8,10,2008);Dateday1(9,5);Dateday2(8);DateChristmas(“Dec25,2008”);Datenow;第四章深入类和对象•4.2析构函数与构造函数对应的是析构函数。C++通过析构函数来处

理对象的善后工作。析构函数没有返回类型,没有参数,函数名是类名前加“~”。析构函数的作用为:(1)执行析构函数(一般没有具体的工作);(2)释放对象的存储空间。(该功能由系统自动完成。)注意:析构函数需要负责释放new申请的空间。12第四章深入类和对象•4.2

析构函数可以使用完全限定名方式显式地调用析构函数;若没有显式调用,则在一个对象的作用域结束时,系统自动调用析构函数。系统自动调用构造函数和自动调用析构函数的顺序是相反的。classX{public:X(){}~X(){}};(ex4-8.cpp)1

3考虑一个数组,数组的大小在定义时初始化,而且其大小在运行时可以改变。classArray{int*p;intsize;public:Array(intnum){size=num;p=newint[size];}~Array(){delete[]p;}...}

;第四章深入类和对象•4.3拷贝构造函数1.什么是拷贝构造函数构造函数的参数可以是任何类型参数,甚至可以将自己类对象的(常量)引用作为参数,称它为拷贝构造函数。拷贝构造函数有两个含义:首先,它是一个构造函数,当创建一个新对象时,系统自动调用它;其次,它将一个已经定义过的对象(参数代表的对

象)的数据成员逐一对应地拷贝给新对象。15第四章深入类和对象•4.3拷贝构造函数classA{intx;inty;public:A(int,int);//一般构造函数A(constA&objA)//拷贝构造

函数{x=objA.x;y=objA.y;}…};…//成员函数的实现16voidmain(){Aobj1(10,20);//调用A(int,int)Aobj2(obj1);//调用A(constA&);Aobj3=obj2;//调用A(constA&);…}第四章深入类和对象•4.3拷贝构

造函数1.什么是拷贝构造函数如果一个类没有显式定义拷贝构造函数,C++编译器可以为该类产生一个缺省的拷贝构造函数。缺省的拷贝构造函数,也将拷贝对象的各个数据成员拷贝给被拷贝对象的各个数据成员。这样一来,两个对象的内存映像是一模一样的。18第四章深入类和对象•4.3拷贝构造函数2.

拷贝构造函数的作用拷贝构造函数的作用是:①创建一个新对象,并将一个已存在的对象拷贝到这个新对象②对象本身做参数(将实参对象拷贝给形参对象)③函数返回对象(拷贝返回的对象给一个临时对象)(ex4-9..10.cpp)19classstri

ng{intlength;char*contents;intwho;public:string(intid){length=0;contents=NULL;who=id;}…};stringfun(stringarg){return(arg);}voidmain(){st

rings=1;stringt=fun(s);}第四章深入类和对象•4.4对象的创建、释放和初始化1.对象的创建和释放可以创建不同形式的各类对象:①命名的自动对象每次进入该对象的作用域,都调用构造函数;每次退出该

对象的作用域,都调用析构函数。21第四章深入类和对象•4.4对象的创建、释放和初始化classTable{…};voidf(inta){Tableaa;//aa的生命期到f函数返回Tablebb;//b

b的生命期到f函数返回if(a>0){Tablecc;//cc的生命期到if语句结束…}Tabledd;//dd的生命期到f函数返回…};//若调用函数f(10)则调用构造函数的顺序是:aa、bb、cc、dd;调用析构函数的顺序是:cc、dd、bb、aa。22第四

章深入类和对象•4.4对象的创建、释放和初始化②自由对象(动态对象)使用new创建对象(实际上调用构造函数),使用delete释放对象(实际上调用析构函数);当delete释放对象后,该对象就不能再被使用。如果构造函数有参数,也必须给出实参。(ex4-13.c

pp)23注意全局对象:在程序运行前,调用构造函数创建它们整个程序结束时,调用析构函数释放它们第四章深入类和对象•4.4对象的创建、释放和初始化2.对象的初始化初始化有许多表示法,C++语言允许下述三种表示方法。①C风格

的初始值表的方法②赋值表达式的方法③表达式表的方法•Class_NameObject(…);•Class_NameObject=…;25第四章深入类和对象•4.5对象和指针4.5.1this指针C++为所有非静态成员函数提供了一个称为this的指针,

因此,常常称成员函数拥有this指针。this是一个隐含的指针,不能被显式声明它只是一个形参,一个局部变量在任何一个非静态成员函数里都存在它局部于某一对象。this指针是一个常指针,可以表示为(但不能显式声明):X*constthis;26第四章深入类和对象•4

.5对象和指针4.5.1this指针可以使用const说明符将this声明为指向常量的常指针。在类中,一个成员函数的原型后跟一个const,该函数称为const成员函数,它的特点是该函数不能修改this所指的对象的成员。例intGetInt()co

nst;this指针主要用在运算符重载、自引用等场合。(ex4-15.cpp)27classINT{intnum;public:voidset(intx){num=x;}voidout(){cout<<num<<‘’;}voidfun(INTobj){INTfunObj;num=1

0;obj.num=20;funObj.num=30;out();obj.out();funObj.out();set(40);obj.set(50);funObj.set(60);out();obj.out();funObj.out();}};//类定义结束voidmain(

){INTmainObj;mainObj.set(1);mainObj.out();mainObj.fun(mainObj);mainObj.out();}则程序输出:110203040506040第四章深入类和对象•4.5对象和指针4.5.2指向类对

象的指针在C++中,可以直接使用对象,也可通过指向对象的指针变量来使用对象。说明指向对象的指针变量的语法与说明指向其他任何数据类型的指针变量的语法相同。One_Class_Name*obj_pointer;可以通过指向对象的指针变量->类的公

有成员的方式在类外访问一个类的成员。(ex4-16.cpp)31第四章深入类和对象•4.5对象和指针4.5.3指向类的成员的指针C++语言中,可以说明指向类的数据成员的指针和指向类的成员函数的指针。这两种指针必须与对象或指向对象的指针结合使

用。32第四章深入类和对象•4.5对象和指针4.5.3指向类的成员的指针1.指向类的数据成员的指针指向类的数据成员的指针定义格式为:类型名类名::*指针;这种说明不是说指针是属于类的而是说明指针只能指向指定类的指定类型的成员(ex4-17.c

pp)33第四章深入类和对象•4.5对象和指针4.5.3指向类的成员的指针2.指向类的成员函数的指针指向类的成员函数的指针定义的格式为:类型名(类名::*指针)(参数表);函数指针并不属于类,而是只能指向类的

指定原型的函数。(ex4-18.cpp)34第四章深入类和对象•4.6友元关系一个对象的私有数据,只能通过成员函数进行访问,这是一堵不透明的墙。这种限制性的用法给两个类必须共享同一函数的情形带来了较大的开销。出于效率(而非技术上必须)考虑,C++提供了一种

辅助手段,允许外面的类或函数去访问一个类的私有数据。35classINTEGER{private:intnum;public:voidSet(intn){num=n;}};voidPrint(INTEGERobj){cout<<obj.num;}//错误why?voidmian(){INT

EGERINTobj;INTobj.set(100);Print(INTobj);…}classINTEGER{private:intnum;public:voidSet(intn){num=n;}friendvoidPrint

(INTEGER);};voidPrint(INTEGERobj){cout<<obj.num;}//okvoidmian(){INTEGERINTobj;INTobj.set(100);Print(INTobj)

;…}类X的友元可以是一个函数(或是一个类)它不是X的成员函数,但能访问X的私有成员和保护段的成员,除了具有这一访问权限外F在作用域、声明和定义等方面都是一普通的函数(或类)。第四章深入类和对象•4.6友元关系4.6.1友元函数友元函数不属于类,友元函数

没有this指针这是友元函数与成员函数的主要区别。友元函数的声明可以放在类的任何段里。39第四章深入类和对象•4.6友元关系4.6.2友元类classPrinter;classINTEGER{private:intnum1;friendPrin

ter;…};类Printer的成员函数全都是类INTEGER的友元函数;可以访问类INTEGER的任何成员。40第四章深入类和对象•4.6友元关系4.6.3友元关系的总结友元具有如下的特性:非传递性。即A是B的

友元,B是C的友元,但A不一定是C的友元(除非将A声明为C的友元);非对称性。即A是B的友元,但B不一定是A的友元(除非将B声明为A的友元)。41第四章深入类和对象•4.7与类和对象相关的问题4.7.1对象数组可以像创建任何其他数据类型的数组一样的方式来创建一个类

的对象数组。创建对象数组,每个数组元素都是一个对象,所以需要多次调用构造函数;释放对象数组,也需要多次调用析构函数。One_Class_Nameobj_array[10];42第四章深入类和对象•4.7与类和对象相关的问题4.7.1对象数

组C++语言不允许初始化对象数组,所以,要创建一个类的对象数组,该类的构造函数必须满足下列三个条件之一:①没有构造函数;②有构造函数,但要有一个构造函数不带参数;③有构造函数,但要有一个构造函数具有的参数全是缺省参数。(ex4-22.cpp)43第四章深入类和对象•4.7

与类和对象相关的问题4.7.2类类型做参数类型由于类是一个数据类型,也可以将对象作为参数传递给函数参数传递遵循传值(或传地址)的方式,这同所有其他的数据类型是相同的。类类型做形参类型,一般有3种方式:①对象本身做参数(传值)②对象引用做参数(传地址)③对象指针做参数(

传值)(ex4-23.cpp)44classOBJ{intnum;public:voidset_num(intx){num=x;}voidout_num(){cout<<num<<‘’;}};voidfun(OBJobjx){

objx.out_num();objx.set_num(100);objx.out_num();}voidmain(){OBJobj;obj.set_num(10);fun(obj);obj.out_num();}结果为10

10010voidfun(OBJ&objx){objx.out_num();objx.set_num(100);objx.out_num();}voidmain(){OBJobj;obj.set_num(10);fun(obj);obj

.out_num();}结果为10100100voidfun(OBJ*objp){objp->out_num();objp->set_num(100);objp->out_num();}voidmain(){OBJobj;obj

.set_num(10);fun(&obj);obj.out_num();}结果为10100100第四章深入类和对象•4.7与类和对象相关的问题4.7.2类类型做参数类型对象本身做参数,对形参的任何修改都不影响用作实参的对象;对象引用做参数,对形参的任何修改就是对实参的对象的修改;对象指针

做参数,对它指向的对象作任何修改就是对实参对象的修改。49第四章深入类和对象•4.7与类和对象相关的问题4.7.3类类型常量类类型常量的基本形式为:类名(常量表)(ex4-24.cpp)50第四章深入类和对象•4.7与类和对象相关的问题4.7.4一个类的对象作为另一个类的成员一个类的对象可以

作为另一个类的数据成员,简称为对象作为成员,实现的是整体和部分之间的关系(apartof),即对象的包含关系,有时也称为类之间的“复合”(composition)。可以通过外部对象名.内部对象名.内部对象公有成员的方式来直接访问内部对象的公有成员。(ex4-25.cpp)51第四章深入类

和对象•4.7与类和对象相关的问题4.7.4一个类的对象作为另一个类的成员一个复合类在构造的时候,首先调用的是内部类对象的构造函数。如果内部类对象多于一个,则它们的构造函数的调用顺序依照它们的定义顺序。此后,再调用外部类的构造函数。而在复合类对象析构的时候,析构函数的调用顺序正好与构造是相反。

52考虑点和圆的关系。圆的属性包括圆心和半径,而圆心就是一个点。classPoint{intx,y;public:Point(intx1,inty1){x=x1;y=y1;}voidsetxy(…);

…};classCircle{floatr;Pointcircle_point;public:Circle(floatr1,inta,intb):circle_point(a,b){r=r1;}voidset_point(…){circle_point.setxy(…);}

…};voidmain(){Circlecobj(5.6,1,2);cobj.set_point(…);…}第四章深入类和对象•4.7与类和对象相关的问题4.7.5非局部环境在函数体外定义的变量(如全局变量、类中的静态成员等)称为非局部变量

。它们在main函数执行前进行初始化(如果是对象,则在main函数执行前调用构造函数),在main函数执行结束时才释放对应的存储空间。55第四章深入类和对象•4.7与类和对象相关的问题4.7.6临时对象当函数的返回类型为类类型时,将调用拷贝构造函数将返回的对象保存到那个临时对象中。另外,在

类对象的运算中,也可能会产生临时对象。临时对象也可以由显示构造函数的调用来创建。56•利用链表构造一个堆栈类Stack,•定义在链表上的最小操作为插入(push)—在链表前面增加一个项获取(pop)—获取链表第

一个项,并将之删除清除(clear)—在链表中删除所有的项classlist;classnode{friendlist;node*next;intitem;};classlist{node*head;//链表的头指

针intnode_num;//链表中节点的个数public:list(){head=0;node_num=0;}voidpush(intnumb);intpop();voidclear();~list(){clear();}};voidlist::push(int

numb){node_num++;node*temp;temp=newnode;temp->item=numb;temp->next=head;head=temp;}intlist::pop(){if(head==0){cout<<“Error:emptylist\n”;return-1;}els

e{node_num--;intnumb;node*pnode=head;numb=pnode->item;head=head->next;deletepnode;returnnumb;}}voidli

st::clear(){node_num=0;while(head)pop();}

小橙橙
小橙橙
文档分享,欢迎浏览!
  • 文档 25747
  • 被下载 7
  • 被收藏 0
相关资源
广告代码123
若发现您的权益受到侵害,请立即联系客服,我们会尽快为您处理。侵权客服QQ:395972555 (支持时间:9:00-21:00) 公众号
Powered by 太赞文库
×
确认删除?