C技能培训三实用_第1页
C技能培训三实用_第2页
C技能培训三实用_第3页
C技能培训三实用_第4页
C技能培训三实用_第5页
已阅读5页,还剩45页未读 继续免费阅读

下载本文档

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

文档简介

会计学1C技能培训三实用2023/1/17指针与引用比较指针与引用都是间接引用其他对象。首先,要认识到在任何情况下都不能使用指向空值的引用。一个引用必须总是指向某些对象。因此如果你使用一个变量并让它指向一个对象,但是该变量在某些时候也可能不指向任何对象,这时你应该把变量声明为指针,因为这样你可以赋空值给该变量。相反,如果变量肯定指向一个对象,例如你的设计不允许变量为空,这时你就可以把变量声明为引用。

第1页/共50页2023/1/17指针与引用比较char*pc=0;//设置指针为空值

char&rc=*pc;//让引用指向空值

这是非常有害的,毫无疑问。结果将是不确定的(编译器能产生一些输出,导致任何事情都有可能发生)。第2页/共50页2023/1/17指针与引用比较引用必须初始化string&rs;//错误,引用必须被初始化

strings("xyzzy");

string&rs=s;//正确,rs指向s

指针没有这样的限制。

string*ps;//未初始化的指针

//合法但危险

第3页/共50页2023/1/17指针与引用比较不存在指向空值的引用这个事实意味着使用引用的代码效率比使用指针的要高。因为在使用引用之前不需要测试它的合法性。

voidprintDouble(constdouble&rd)

{

cout<<rd;//不需要测试rd,它

}//肯定指向一个double值

相反,指针则应该总是被测试,防止其为空:

voidprintDouble(constdouble*pd)

{

if(pd){//检查是否为NULL

cout<<*pd;

}

}

第4页/共50页2023/1/17指针与引用比较指针与引用的另一个重要的不同是指针可以被重新赋值以指向另一个不同的对象。但是引用则总是指向在初始化时被指定的对象,以后不能改变。

strings1("Nancy");

strings2("Clancy");

string&rs=s1;//rs引用s1

string*ps=&s1;//ps指向s1

rs=s2;//rs仍旧引用s1,

//但是s1的值现在是

//"Clancy"

ps=&s2;//ps现在指向s2;

//s1没有改变

第5页/共50页2023/1/17指针与引用比较总的来说,在以下情况下你应该使用指针,一是你考虑到存在不指向任何对象的可能(在这种情况下,你能够设置指针为空),二是你需要能够在不同的时刻指向不同的对象(在这种情况下,你能改变指针的指向)。如果总是指向一个对象并且一旦指向一个对象后就不会改变指向,那么你应该使用引用。

还有一种情况,就是当你重载某个操作符时,你应该使用引用。最普通的例子是操作符[]。这个操作符典型的用法是返回一个目标对象,其能被赋值。

vector<int>v(10);//建立整形向量(vector),大小为10;

v[5]=10;//这个被赋值的目标对象就是操作符[]返回的值

如果操作符[]返回一个指针,那么后一个语句就得这样写:

*v[5]=10;

但是这样会使得v看上去象是一个向量指针。因此你会选择让操作符返回一个引用。

当你知道你必须指向一个对象并且不想改变其指向时,或者在重载操作符并为防止不必要的语义误解时,你不应该使用指针。而在除此之外的其他情况下,则应使用指针第6页/共50页2023/1/17函数类别内部函数和外部函数内部函数:内部函数时是在定义它的文件中可以被调用的函数,而在同一程序的其他文件中不可调用,定义内部函数的格式如下:static类型说明函数名(参数表){

函数体;}第7页/共50页2023/1/17函数类别外部函数:外部函数是作用域在整个程序中的函数,包含组成该程序的若干个文件。外部函数的定义格式如下:[extern]类型说明函数名(参数表)第8页/共50页2023/1/17函数重载所谓重载就是赋给同一个函数名不同的含义。具体的讲,c++中允许在相同的作用域内以相同的名字定义几个不同实现的函数,可以是类成员函数,也可以是普通的函数。但是,定义重载函数时要求同名函数的参数至少有一个类型不同,或者个数不同,否则会造成二义性。而对返回值没有要求。第9页/共50页2023/1/17函数指针定义方式数据类型(*函数名)(参数列表);

应用(小学生四则混合运算综合程序设计):要求:一张试卷包含十道题目 题目随机产生 考生做完后可以查看得分intadd(intleft,intright){ returnleft+right;}intsub(intleft,intright){ returnleft+right;}第10页/共50页2023/1/17函数指针intmultiply(intleft,intright){ returnleft*right;}intdivide(intleft,intright){ if(right==0) return-1; returnleft/right;}第11页/共50页2023/1/17函数指针structTopic{ intleft; charop; intright; intresult; intkey; boolflag;};structPaper{ intnum; Topic*topics; charname[15]; intscore;};第12页/共50页2023/1/17函数指针Paper*createPaper(char*name){ Paper*paper=newPaper; strcpy(paper->name,name); paper->topics=newTopic[10]; paper->num=10; charop[4]={'+','-','*','/'}; for(inti=0;i<10;++i) { intwhichop=rand()%4; intleft=rand()%100; intright=rand()%100;

paper->topics[i].left=left; paper->topics[i].right=right; paper->topics[i].op=op[whichop]; } returnpaper;}第13页/共50页2023/1/17函数指针intgetResult(intleft,intright,charop){ int(*fun)(int,int); switch(op) { case'+': fun=add; break; case'-': fun=sub; break; case'*': fun=multiply; break; case'/': fun=divide; break; default: break; } returnfun(left,right);}第14页/共50页2023/1/17函数指针voidtestSystem(){ cout<<"***************************小学生四则混合运算"; cout<<"***************************"<<endl; charname[15]={0}; cout<<"请输入考生姓名:"; cin>>name; Paper*paper=createPaper(name); intcount=0; for(inti=0;i<paper->num;++i) { intresult;cout<<paper->topics[i].left<<paper->topics[i].op<<paper->topics[i].right<<"="; cin>>result;paper->topics[i].result=result; paper->topics[i].key=getResult(paper->topics[i].left,paper->topics[i].right,paper->topics[i].op); if(result==paper->topics[i].key) {paper->topics[i].flag=true;++count;} else {paper->topics[i].flag=false;} } paper->score=count*100/paper->num; cout<<"恭喜您得了"<<paper->score<<"分"<<endl; deletepaper;}第15页/共50页2023/1/17函数指针voidmain(){ testSystem();}第16页/共50页2023/1/17链表实现数据结构程序=算法+数据结构常见数据结构分类 数组 集合 线性表 树结构 图结构第17页/共50页2023/1/17线性表单向链表结点定义structlink { intdata;//数据域 link*next;//指针域 };数据域指针域数据域指针域A结点B结点第18页/共50页2023/1/17单向链表的实现link*createSingleLink(){ inta[15]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}; link*head=newlink; head->data=a[0]; head->next=NULL; link*tmp=head; for(inti=1;i<15;++i) { link*newnode=newlink; newnode->data=a[i]; newnode->next=NULL; tmp->next=newnode; tmp=newnode; } returnhead;}第19页/共50页2023/1/17单向链表的实现voidprint(link*head){ while(head!=NULL) { cout<<head->data<<endl; head=head->next; }}voidmain(){ link*head=createSingleLink(); print(head);}第20页/共50页2023/1/17双向表双向链表结点定义structlink { intdata;//数据域

link*prev;//指针域 link*next;//指针域 };第21页/共50页2023/1/17双向表应用举例:有15个人围成一圈,轮流按1,2,3报数,报到3的人退出圈子。下一个人报1,问最后一个人是谁?第22页/共50页2023/1/17双向表#defineN15inta[15]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};charch[15]={'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o'};structlink { intdata;//数据域

link*prev;//指针域

link*next;//指针域

};第23页/共50页2023/1/17双向表link*createDleLink(){

link*head=newlink; head->prev=head->next=NULL; head->data=a[0]; link*tmp=head; for(inti=1;i<N;++i) { link*newnode=newlink; newnode->data=a[i]; newnode->next=NULL; newnode->prev=tmp; tmp->next=newnode; tmp=newnode; } tmp->next=head; head->prev=tmp; returnhead;}第24页/共50页2023/1/17intgetLast(link*phead){ intcount=N; intstep=3; intseq=1; link*head=phead; while(count>1) { if(seq==step) { link*tmp=head->next; head->prev->next=head->next; head->next->prev=head->prev;

deletehead; head=tmp; seq=1; --count; } else { head=head->next; ++seq; }

} returnhead->data;}第25页/共50页2023/1/17双向表voidapp(){ link*head=createDleLink(); cout<<ch[getLast(head)]<<endl;}voidmain(){ app();}第26页/共50页2023/1/17面向对象程序设计思想从现实世界中客观存在的事物(对象)出发来构造系统,并在系统构造中尽可能地运用人类的自然思维方式。第27页/共50页2023/1/17以面向对象思想构造软件系统的主要内容1、对象是以面向对象方法构造的系统的基本单位。对象是对问题域中客观存在的事物的抽象。2、对象的属性和操作组成一个完整的对象,对象具有一定的对外接口,外界对象可以通过该接口来访问对象。3、以对象为基础,对对象分类,将具有共同特性的对象进行抽象,形成对这些对象的抽象描述——类,每个对象就是该类的一个实例。第28页/共50页2023/1/174、对形成的对象类进一步抽象,抽出这些类的共同特征,形成基本的类和派生的类,派生的类又可以具有更多的派生类,这样就形成一个类簇。基本类和派生类的关系称为继承。5、一个系统就是由各个对象组成,对象和对象之间存在静态关系和动态关系。静态关系体现了对象之间固有的关系;动态关系是对象之间通过发送消息进行通信,相互协作,完成系统功能。第29页/共50页2023/1/17面向对象程序方法面向对象方法是利用抽象、封装等机制,借助于对象、类、继承、消息传递等概念进行软件系统构造的软件开发方法。第30页/共50页2023/1/17面向对象方法的形成1、面向对象程序设计语言的三阶段☆发生☆发展☆成熟第31页/共50页2023/1/17面向对象方法的形成2、Smalltalk语言

Smalltalk是第一个完善的、实用的纯面向对象的语言。它有三个特点:(1)将任何东西都看成对象,包括类本身。对对象的方法的调用在Smalltalk中称为发送消息给对象。第32页/共50页2023/1/17Smalltalk语言(2)不进行任何类型检查操作,强调多态性和动态连接。(3)Smalltalk不仅是一种语言,它还是一个具有类库支持和交互式图形拥护界面的完整的程序设计环境。第33页/共50页2023/1/17面向对象程序设计语言的分类(1)纯粹的面向对象程序设计语言完全依照面向对象思想而设计的,它的所有语言成分都以对象为核心。如:Smalltalk、Eiffel、Actor和JAVA等第34页/共50页2023/1/17面向对象程序设计语言的分类(2)混合的面向对象程序设计语言在某种已经被广泛使用的其他语言的基础上增加了支持面向对象思想的语言成分。如:ObjectC、C++、ObjectPascal、和CLOS等第35页/共50页2023/1/17类和对象类的定义格式class类名{ public: 成员函数或数据成员的说明;

private: 数据成员或成员的说明;};

第36页/共50页2023/1/17类和对象公有成员:可以被程序中任何代码访问;私有的成员只能被类本身的成员函数及友元类的成员函数访问,其他类的成员函数,包括其派生类的成员函数都不能访问他们:保护的成员与私有成员类似,只是除了类本身的成员函数和说明为友元类的成员函数可以访问保护成员外,该类的派生类成员也可以访问。第37页/共50页2023/1/17举例classA{ private:inti;protected: intj;public:intk;intgeti(){returni;}intgetj(){returnj;}intgetk(){returnk;}};第38页/共50页2023/1/17下面是访问类A的对象a中数据成员的各种情况:Aa;//定义类A的对象aa.i;//非法,i为A的私有成员a.j;//非法,j为A的保护成员a.k;//合法,k为A的公有成员本例的所有成员函数都是在类体中。若在类体外实现。若在类体外实现,需要使用作用域运算符::,用它来标识某个成员函数是属于哪个类的。该运算符在这里使用的格式如下:类名::函数名(参数表)intA::geti(){ returni;}第39页/共50页2023/1/17对象普通对象定义在定义了一个类以后,定义其对象的一般格式如下:类名对象名表;对象指针定义类名*对象指针名表;Aa1,a2,*p;第40页/共50页2023/1/17对象数组对象数组是指数组元素为对象的数组。该数组中若干个元素必须是同一个类的若干个对象。对象数组的定义,赋值和引用与普通数组一样,只是数组的元素与普通数组不同,它是同类的若干个对象。类名数组名[大小]…SampleArray[5];第41页/共50页2023/1/17构造函数和析构函数构造函数构造函数功能:在创建对象时使用给定的值将对象初始化。构造函数的特点:(1)构造函数是成员函数,函数体可放在类体内,也可放在类体外。(2)构造函数是一个特殊的函数,该函数的名字与类名相同,且不指定类型说明,它有隐含的返回值,该值由系统内部使用。该函数可以有一个参数,也可以有多个参数第42页/共50页2023/1/17构造函数和析构函数(3)构造函数可以重载,即可以定义多个参数不同的函数。(4)程序中不能直接调用构造函数,在创建对象时系统自动调用构造函数。和一般成员函数类似,类的构造函数可以带有参数,也可以重载,构造函数的重载表示类对象的不同的初始化方式。不带任何参数的构造函数为默认构造函数。第43页/共50页2023/1/17示例程序一classSample{ intn;

public:

Sample(){n=0;}; Sample(inti){n=i;}

温馨提示

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

评论

0/150

提交评论