《C技能培训三实用实用教案》由会员分享,可在线阅读,更多相关《C技能培训三实用实用教案(51页珍藏版)》请在金锄头文库上搜索。
1、2024/8/14指针(zhzhn)与引用比较指针与引用都是间接引用其他对象。首先,要认识到在任何情况下都不能使用指向空值的引用。一个引用必须总是(znsh)指向某些对象。因此如果你使用一个变量并让它指向一个对象,但是该变量在某些时候也可能不指向任何对象,这时你应该把变量声明为指针,因为这样你可以赋空值给该变量。相反,如果变量肯定指向一个对象,例如你的设计不允许变量为空,这时你就可以把变量声明为引用。第1页/共50页第一页,共51页。2024/8/14指针与引用(ynyng)比较char*pc=0;/设置指针为空值char&rc=*pc;/让引用指向空值这是非常有害的,毫无疑问(howywn)
2、。结果将是不确定的(编译器能产生一些输出,导致任何事情都有可能发生)。第2页/共50页第二页,共51页。2024/8/14指针(zhzhn)与引用比较引用必须(bx)初始化string&rs;/错误,引用必须(bx)被初始化strings(xyzzy);string&rs=s;/正确,rs指向s指针没有这样的限制。string*ps;/未初始化的指针/合法但危险第3页/共50页第三页,共51页。2024/8/14指针(zhzhn)与引用比较不存在指向空值的引用这个事实意味着使用引用的代码效率比使用指针(zhzhn)的要高。因为在使用引用之前不需要测试它的合法性。voidprintDouble(
3、constdouble&rd)coutrd;/不需要测试rd,它/肯定指向一个double值相反,指针(zhzhn)则应该总是被测试,防止其为空:voidprintDouble(constdouble*pd)if(pd)/检查是否为NULLcout*pd;第4页/共50页第四页,共51页。2024/8/14指针(zhzhn)与引用比较指针与引用的另一个重要的不同是指针可以被重新赋值以指向另一个不同的对象。但是引用则总是指向在初始化时被指定(zhdng)的对象,以后不能改变。strings1(Nancy);strings2(Clancy);string&rs=s1;/rs引用s1string*p
4、s=&s1;/ps指向s1rs=s2;/rs仍旧引用s1,/但是s1的值现在是/Clancyps=&s2;/ps现在指向s2;/s1没有改变第5页/共50页第五页,共51页。2024/8/14指针与引用(ynyng)比较总的来说,在以下情况下你应该使用指针,一是你考虑到存在不指向(zhxin)任何对象的可能(在这种情况下,你能够设置指针为空),二是你需要能够在不同的时刻指向(zhxin)不同的对象(在这种情况下,你能改变指针的指向(zhxin))。如果总是指向(zhxin)一个对象并且一旦指向(zhxin)一个对象后就不会改变指向(zhxin),那么你应该使用引用。还有一种情况,就是当你重载某
5、个操作符时,你应该使用引用。最普通的例子是操作符。这个操作符典型的用法是返回一个目标对象,其能被赋值。vectorv(10);/建立整形向量(vector),大小为10;v5=10;/这个被赋值的目标对象就是操作符返回的值如果操作符返回一个指针,那么后一个语句就得这样写:*v5=10;但是这样会使得v看上去象是一个向量指针。因此你会选择让操作符返回一个引用。当你知道你必须指向(zhxin)一个对象并且不想改变其指向(zhxin)时,或者在重载操作符并为防止不必要的语义误解时,你不应该使用指针。而在除此之外的其他情况下,则应使用指针第6页/共50页第六页,共51页。2024/8/14函数(hns
6、h)类别内部函数和外部(wib)函数内部函数:内部函数时是在定义它的文件中可以被调用的函数,而在同一程序的其他文件中不可调用,定义内部函数的格式如下:static类型说明函数名(参数表)函数体;第7页/共50页第七页,共51页。2024/8/14函数(hnsh)类别外部函数:外部函数是作用域在整个程序中的函数,包含组成该程序的若干个文件。外部函数的定义格式如下:extern类型(lixng)说明函数名(参数表)第8页/共50页第八页,共51页。2024/8/14函数(hnsh)重载所谓重载就是赋给同一个函数名不同的含义。具体的讲,c+中允许在相同的作用域内以相同的名字定义几个不同实现(shxi
7、n)的函数,可以是类成员函数,也可以是普通的函数。但是,定义重载函数时要求同名函数的参数至少有一个类型不同,或者个数不同,否则会造成二义性。而对返回值没有要求。第9页/共50页第九页,共51页。2024/8/14函数指针定义方式数据类型(*函数名)(参数列表);应用(yngyng)(小学生四则混合运算综合程序设计):要求:一张试卷包含十道题目题目随机产生考生做完后可以查看得分intadd(intleft,intright)returnleft+right;intsub(intleft,intright)returnleft+right;第10页/共50页第十页,共51页。2024/8/14函数
8、指针intmultiply(intleft,intright)returnleft*right;intdivide(intleft,intright)if(right=0)return-1;returnleft/right;第11页/共50页第十一页,共51页。2024/8/14函数指针structTopicintleft;charop;intright;intresult;intkey;boolflag;structPaperintnum;Topic*topics;charname15;intscore;第12页/共50页第十二页,共51页。2024/8/14函数指针Paper*create
9、Paper(char*name)Paper*paper=newPaper;strcpy(paper-name,name);paper-topics=newTopic10;paper-num=10;charop4=+,-,*,/;for(inti=0;itopicsi.left=left;paper-topicsi.right=right;paper-topicsi.op=opwhichop;returnpaper;第13页/共50页第十三页,共51页。2024/8/14函数指针intgetResult(intleft,intright,charop)int(*fun)(int,int);swi
10、tch(op)case+:fun=add;break;case-:fun=sub;break;case*:fun=multiply;break;case/:fun=divide;break;default:break;returnfun(left,right);第14页/共50页第十四页,共51页。2024/8/14函数指针voidtestSystem()cout*小学生四则混合运算;cout*endl;charname15=0;coutname;Paper*paper=createPaper(name);intcount=0;for(inti=0;inum;+i)intresult;cout
11、topicsi.lefttopicsi.optopicsi.rightresult;paper-topicsi.result=result;paper-topicsi.key=getResult(paper-topicsi.left,paper-topicsi.right,paper-topicsi.op);if(result=paper-topicsi.key)paper-topicsi.flag=true;+count;elsepaper-topicsi.flag=false;paper-score=count*100/paper-num;cout恭喜您得了score分data=a0;he
12、ad-next=NULL;link*tmp=head;for(inti=1;idata=ai;newnode-next=NULL;tmp-next=newnode;tmp=newnode;returnhead;第19页/共50页第十九页,共51页。2024/8/14单向(dnxin)链表的实现voidprint(link*head)while(head!=NULL)coutdatanext;voidmain()link*head=createSingleLink();print(head);第20页/共50页第二十页,共51页。2024/8/14双向表双向链表结点( jidin)定义struc
13、tlinkintdata;/数据域link*prev;/指针域link*next;/指针域;第21页/共50页第二十一页,共51页。2024/8/14双向表应用举例:有15个人围成一圈,轮流按1,2,3报数,报到3的人退出圈子(qunzi)。下一个人报1,问最后一个人是谁?第22页/共50页第二十二页,共51页。2024/8/14双向表#defineN15inta15=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15;charch15=a,b,c,d,e,f,g,h,i,j,k,l,m,n,o;structlinkintdata;/数据(shj)域link*prev;/指
14、针域link*next;/指针域;第23页/共50页第二十三页,共51页。2024/8/14双向表link*createDleLink()link*head=newlink;head-prev=head-next=NULL;head-data=a0;link*tmp=head;for(inti=1;idata=ai;newnode-next=NULL;newnode-prev=tmp;tmp-next=newnode;tmp=newnode;tmp-next=head;head-prev=tmp;returnhead;第24页/共50页第二十四页,共51页。2024/8/14intgetLas
15、t(link*phead)intcount=N;intstep=3;intseq=1;link*head=phead;while(count1)if(seq=step)link*tmp=head-next;head-prev-next=head-next;head-next-prev=head-prev;deletehead;head=tmp;seq=1;-count;elsehead=head-next;+seq;returnhead-data;第25页/共50页第二十五页,共51页。2024/8/14双向表voidapp()link*head=createDleLink();coutchg
16、etLast(head)endl;voidmain()app();第26页/共50页第二十六页,共51页。2024/8/14面向对象程序设计(chnxshj)思想从现实世界中客观存在的事物(对象)出发来构造系统(xtng),并在系统(xtng)构造中尽可能地运用人类的自然思维方式。第27页/共50页第二十七页,共51页。2024/8/14以面向对象思想(sxing)构造软件系统的主要内容1、对象是以面向对象方法构造的系统的基本单位。对象是对问题域中客观存在的事物的抽象。2、对象的属性和操作组成一个完整的对象,对象具有一定的对外接口,外界对象可以(ky)通过该接口来访问对象。3、以对象为基础,对
17、对象分类,将具有共同特性的对象进行抽象,形成对这些对象的抽象描述类,每个对象就是该类的一个实例。第28页/共50页第二十八页,共51页。2024/8/144、对形成的对象类进一步抽象,抽出这些类的共同特征,形成基本的类和派生的类,派生的类又可以具有更多的派生类,这样就形成一个类簇。基本类和派生类的关系称为继承(jchng)。5、一个系统就是由各个对象组成,对象和对象之间存在静态关系和动态关系。静态关系体现了对象之间固有的关系;动态关系是对象之间通过发送消息进行通信,相互协作,完成系统功能。第29页/共50页第二十九页,共51页。2024/8/14面向对象程序(chngx)方法面向对象方法(fn
18、gf)是利用抽象、封装等机制,借助于对象、类、继承、消息传递等概念进行软件系统构造的软件开发方法(fngf)。第30页/共50页第三十页,共51页。2024/8/14面向对象方法(fngf)的形成1、面向对象程序设计语言的三阶段发生发展(fzhn)成熟第31页/共50页第三十一页,共51页。2024/8/14面向对象方法(fngf)的形成2、Smalltalk语言Smalltalk是第一个完善的、实用(shyng)的纯面向对象的语言。它有三个特点:(1)将任何东西都看成对象,包括类本身。对对象的方法的调用在Smalltalk中称为发送消息给对象。第32页/共50页第三十二页,共51页。2024
19、/8/14Smalltalk语言(yyn)(2)不进行任何类型(lixng)检查操作,强调多态性和动态连接。(3)Smalltalk不仅是一种语言,它还是一个具有类库支持和交互式图形拥护界面的完整的程序设计环境。第33页/共50页第三十三页,共51页。2024/8/14面向对象程序设计(chnxshj)语言的分类(1)纯粹的面向对象程序设计语言完全依照(yzho)面向对象思想而设计的,它的所有语言成分都以对象为核心。如:Smalltalk、Eiffel、Actor和JAVA等第34页/共50页第三十四页,共51页。2024/8/14面向对象程序设计(chnxshj)语言的分类(2)混合的面向对
20、象程序设计语言在某种已经被广泛使用的其他语言的基础上增加(zngji)了支持面向对象思想的语言成分。如:ObjectC、C+、ObjectPascal、和CLOS等第35页/共50页第三十五页,共51页。2024/8/14类和对象(duxing)类的定义格式class类名public:成员函数(hnsh)或数据成员的说明;private:数据成员或成员的说明;第36页/共50页第三十六页,共51页。2024/8/14类和对象(duxing)公有成员:可以被程序中任何(rnh)代码访问;私有的成员只能被类本身的成员函数及友元类的成员函数访问,其他类的成员函数,包括其派生类的成员函数都不能访问他们
21、:保护的成员与私有成员类似,只是除了类本身的成员函数和说明为友元类的成员函数可以访问保护成员外,该类的派生类成员也可以访问。第37页/共50页第三十七页,共51页。2024/8/14举例(jl)classAprivate:inti;protected:intj;public:intk;intgeti()returni;intgetj()returnj;intgetk()returnk;第38页/共50页第三十八页,共51页。2024/8/14下面是访问类A的对象a中数据成员的各种情况:Aa;/定义类A的对象aa.i;/非法,i为A的私有成员a.j;/非法,j为A的保护成员a.k;/合法,k为A
22、的公有成员本例的所有成员函数都是在类体中。若在类体外实现。若在类体外实现,需要使用作用域运算符:,用它来标识某个成员函数是属于(shy)哪个类的。该运算符在这里使用的格式如下:类名:函数名(参数表)intA:geti()returni;第39页/共50页第三十九页,共51页。2024/8/14对象(duxing)普通对象定义在定义了一个类以后,定义其对象的一般(ybn)格式如下:类名对象名表;对象指针定义类名*对象指针名表;Aa1,a2,*p;第40页/共50页第四十页,共51页。2024/8/14对象(duxing)数组对象数组是指数组元素为对象的数组。该数组中若干个元素必须是同一个类的若干
23、个对象。对象数组的定义,赋值和引用与普通数组一样,只是数组的元素与普通数组不同,它是同类的若干个对象。类名(limn)数组名大小SampleArray5;第41页/共50页第四十一页,共51页。2024/8/14构造函数(hnsh)和析构函数(hnsh)构造函数构造函数功能:在创建对象时使用给定的值将对象初始化。构造函数的特点:(1)构造函数是成员函数,函数体可放在类体内,也可放在类体外。(2)构造函数是一个特殊的函数,该函数的名字与类名相同,且不指定类型说明,它有隐含的返回值,该值由系统(xtng)内部使用。该函数可以有一个参数,也可以有多个参数第42页/共50页第四十二页,共51页。202
24、4/8/14构造函数(hnsh)和析构函数(hnsh)(3)构造函数可以重载,即可以定义多个(du)参数不同的函数。(4)程序中不能直接调用构造函数,在创建对象时系统自动调用构造函数。和一般成员函数类似,类的构造函数可以带有参数,也可以重载,构造函数的重载表示类对象的不同的初始化方式。不带任何参数的构造函数为默认构造函数。第43页/共50页第四十三页,共51页。2024/8/14示例(shl)程序一classSampleintn;public:Sample()n=0;Sample(inti)n=i;voiddisp()cout“n=”nname,name)。paper-topicsi.left=left。paper-topicsi.right=right。case +:。第15页/共50页。对象之间存在静态关系和动态关系。静态关系体现了对象之间固有的关系。该数组中若干个元素必须(bx)是同一个类的若干个对象。第49页/共50页。感谢您的欣赏。第50页/共50页第五十一页,共51页。