《C技能培训三实用.pptx》由会员分享,可在线阅读,更多相关《C技能培训三实用.pptx(50页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、2023/3/23指针与引用比较指针与引用都是间接引用其他对象。首先,要认识到在任何情况下都不能使用指向空值的引用。一个引用必须总是指向某些对象。因此如果你使用一个变量并让它指向一个对象,但是该变量在某些时候也可能不指向任何对象,这时你应该把变量声明为指针,因为这样你可以赋空值给该变量。相反,如果变量肯定指向一个对象,例如你的设计不允许变量为空,这时你就可以把变量声明为引用。第1页/共50页2023/3/23指针与引用比较char*pc=0;/设置指针为空值char&rc=*pc;/让引用指向空值这是非常有害的,毫无疑问。结果将是不确定的(编译器能产生一些输出,导致任何事情都有可能发生)。第2
2、页/共50页2023/3/23指针与引用比较引用必须初始化string&rs;/错误,引用必须被初始化string s(xyzzy);string&rs=s;/正确,rs指向s指针没有这样的限制。string*ps;/未初始化的指针/合法但危险第3页/共50页2023/3/23指针与引用比较不存在指向空值的引用这个事实意味着使用引用的代码效率比使用指针的要高。因为在使用引用之前不需要测试它的合法性。void printDouble(const double&rd)cout rd;/不需要测试rd,它/肯定指向一个double值相反,指针则应该总是被测试,防止其为空:void printDoub
3、le(const double*pd)if(pd)/检查是否为NULLcout *pd;第4页/共50页2023/3/23指针与引用比较指针与引用的另一个重要的不同是指针可以被重新赋值以指向另一个不同的对象。但是引用则总是指向在初始化时被指定的对象,以后不能改变。string s1(Nancy);string s2(Clancy);string&rs=s1;/rs 引用 s1string*ps=&s1;/ps 指向 s1rs=s2;/rs 仍旧引用s1,/但是 s1的值现在是/Clancyps=&s2;/ps 现在指向 s2;/s1 没有改变第5页/共50页2023/3/23指针与引用比较总的
4、来说,在以下情况下你应该使用指针,一是你考虑到存在不指向任何对象的可能(在这种情况下,你能够设置指针为空),二是你需要能够在不同的时刻指向不同的对象(在这种情况下,你能改变指针的指向)。如果总是指向一个对象并且一旦指向一个对象后就不会改变指向,那么你应该使用引用。还有一种情况,就是当你重载某个操作符时,你应该使用引用。最普通的例子是操作符。这个操作符典型的用法是返回一个目标对象,其能被赋值。vector v(10);/建立整形向量(vector),大小为10;v5=10;/这个被赋值的目标对象就是操作符返回的值如果操作符返回一个指针,那么后一个语句就得这样写:*v5=10;但是这样会使得v看上
5、去象是一个向量指针。因此你会选择让操作符返回一个引用。当你知道你必须指向一个对象并且不想改变其指向时,或者在重载操作符并为防止不必要的语义误解时,你不应该使用指针。而在除此之外的其他情况下,则应使用指针 第6页/共50页2023/3/23函数类别内部函数和外部函数内部函数:内部函数时是在定义它的文件中可以被调用的函数,而在同一程序的其他文件中不可调用,定义内部函数的格式如下:static 类型说明 函数名(参数表)函数体;第7页/共50页2023/3/23函数类别外部函数:外部函数是作用域在整个程序中的函数,包含组成该程序的若干个文件。外部函数的定义格式如下:extern 类型说明 函数名(参
6、数表)第8页/共50页2023/3/23函数重载所谓重载就是赋给同一个函数名不同的含义。具体的讲,c+中允许在相同的作用域内以相同的名字定义几个不同实现的函数,可以是类成员函数,也可以是普通的函数。但是,定义重载函数时要求同名函数的参数至少有一个类型不同,或者个数不同,否则会造成二义性。而对返回值没有要求。第9页/共50页2023/3/23函数指针定义方式数据类型(*函数名)(参数列表);应用(小学生四则混合运算综合程序设计):要求:一张试卷包含十道题目题目随机产生考生做完后可以查看得分int add(int left,int right)return left+right;int sub(i
7、nt left,int right)return left+right;第10页/共50页2023/3/23函数指针int multiply(int left,int right)return left*right;int divide(int left,int right)if(right=0)return-1;return left/right;第11页/共50页2023/3/23函数指针struct Topicint left;char op;int right;int result;int key;bool flag;struct Paperint num;Topic*topics;c
8、har name15;int score;第12页/共50页2023/3/23函数指针Paper*createPaper(char*name)Paper*paper=new Paper;strcpy(paper-name,name);paper-topics=new Topic10;paper-num=10;char op4=+,-,*,/;for(int i=0;itopicsi.left=left;paper-topicsi.right=right;paper-topicsi.op=opwhichop;return paper;第13页/共50页2023/3/23函数指针int getRe
9、sult(int left,int right,char op)int(*fun)(int,int);switch(op)case+:fun=add;break;case-:fun=sub;break;case*:fun=multiply;break;case/:fun=divide;break;default:break;return fun(left,right);第14页/共50页2023/3/23函数指针void testSystem()cout*小学生四则混合运算;cout*endl;char name15=0;coutname;Paper*paper=createPaper(nam
10、e);int count=0;for(int i=0;inum;+i)int result;couttopicsi.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;else paper-topicsi.flag=false;paper-
11、score=count*100/paper-num;cout恭喜您得了score分data=a0;head-next=NULL;link*tmp=head;for(int i=1;idata=ai;newnode-next=NULL;tmp-next=newnode;tmp=newnode;return head;第19页/共50页2023/3/23单向链表的实现void print(link*head)while(head!=NULL)coutdatanext;void main()link*head=createSingleLink();print(head);第20页/共50页2023/
12、3/23双向表双向链表结点定义struct linkint data;/数据域link*prev;/指针域link*next;/指针域;第21页/共50页2023/3/23双向表应用举例:有15个人围成一圈,轮流按1,2,3报数,报到3的人退出圈子。下一个人报1,问最后一个人是谁?第22页/共50页2023/3/23双向表#define N 15int a15=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15;char ch15=a,b,c,d,e,f,g,h,i,j,k,l,m,n,o;struct linkint data;/数据域link*prev;/指针域link
13、*next;/指针域;第23页/共50页2023/3/23双向表link*createDleLink()link*head=new link;head-prev=head-next=NULL;head-data=a0;link*tmp=head;for(int i=1;idata=ai;newnode-next=NULL;newnode-prev=tmp;tmp-next=newnode;tmp=newnode;tmp-next=head;head-prev=tmp;return head;第24页/共50页2023/3/23int getLast(link*phead)int count=N
14、;int step=3;int seq=1;link*head=phead;while(count1)if(seq=step)link*tmp=head-next;head-prev-next=head-next;head-next-prev=head-prev;delete head;head=tmp;seq=1;-count;elsehead=head-next;+seq;return head-data;第25页/共50页2023/3/23双向表void app()link*head=createDleLink();coutchgetLast(head)endl;void main()a
15、pp();第26页/共50页2023/3/23面向对象程序设计思想从现实世界中客观存在的事物(对象)出发来构造系统,并在系统构造中尽可能地运用人类的自然思维方式。第27页/共50页2023/3/23以面向对象思想构造软件系统的主要内容1、对象是以面向对象方法构造的系统的基 本单位。对象是对问题域中客观存在的事物的抽象。2、对象的属性和操作组成一个完整的对象,对象具有一定的对外接口,外界对象可以通过该接口来访问对象。3、以对象为基础,对对象分类,将具有共同特性的对象进行抽象,形成对这些对象的抽象描述类,每个对象就是该类的一个实例。第28页/共50页2023/3/234、对形成的对象类进一步抽象,
16、抽出这些类的共同特征,形成基本的类和派生的类,派生的类又可以具有更多的派生类,这样就形成一个类簇。基本类和派生类的关系称为继承。5、一个系统就是由各个对象组成,对象和 对象之间存在静态关系和动态关系。静态关系体现了对象之间固有的关系;动态关系是对象之间通过发送消息进行 通信,相互协作,完成系统功能。第29页/共50页2023/3/23面向对象程序方法面向对象方法是利用抽象、封装等机制,借助于对象、类、继承、消息传递等概念进行软件系统构造的软件开发方法。第30页/共50页2023/3/23面向对象方法的形成1、面向对象程序设计语言的三阶段发生发展成熟第31页/共50页2023/3/23面向对象方
17、法的形成2、Smalltalk语言 Smalltalk是第一个完善的、实用的纯面向对象的语言。它有三个特点:(1)将任何东西都看成对象,包括类本身。对对象的方法的调用在Smalltalk中称为发送消息给对象。第32页/共50页2023/3/23Smalltalk语言(2)不进行任何类型检查操作,强调多态性和动态连接。(3)Smalltalk不仅是一种语言,它还是一个具有类库支持和交互式图形拥护界面的完整的程序设计环境。第33页/共50页2023/3/23面向对象程序设计语言的分类(1)纯粹的面向对象程序设计语言 完全依照面向对象思想而设计的,它的所有语言成分都以对象为核心。如:Smalltal
18、k、Eiffel、Actor和JAVA等第34页/共50页2023/3/23面向对象程序设计语言的分类(2)混合的面向对象程序设计语言 在某种已经被广泛使用的其他语言的基础上增加了支持面向对象思想的语言成分。如:Object C、C+、Object Pascal、和 CLOS等第35页/共50页2023/3/23类和对象类的定义格式class 类名public:成员函数或数据成员的说明;private:数据成员或成员的说明;第36页/共50页2023/3/23类和对象公有成员:可以被程序中任何代码访问;私有的成员只能被类本身的成员函数及友元类的成员函数访问,其他类的成员函数,包括其派生类的成员
19、函数都不能访问他们:保护的成员与私有成员类似,只是除了类本身的成员函数和说明为友元类的成员函数可以访问保护成员外,该类的派生类成员也可以访问。第37页/共50页2023/3/23举例class Aprivate:int i;protected:int j;public:int k;int geti()return i;int getj()return j;int getk()return k;第38页/共50页2023/3/23下面是访问类A的对象a中数据成员的各种情况:A a;/定义类A的对象aa.i;/非法,i为A的私有成员a.j;/非法,j为A的保护成员a.k;/合法,k为A的公有成员本
20、例的所有成员函数都是在类体中。若在类体外实现。若在类体外实现,需要使用作用域运算符:,用它来标识某个成员函数是属于哪个类的。该运算符在这里使用的格式如下:类名:函数名(参数表)int A:geti()return i;第39页/共50页2023/3/23对象普通对象定义在定义了一个类以后,定义其对象的一般格式如下:类名 对象名表;对象指针定义类名*对象指针名表;A a1,a2,*p;第40页/共50页2023/3/23对象数组对象数组是指数组元素为对象的数组。该数组中若干个元素必须是同一个类的若干个对象。对象数组的定义,赋值和引用与普通数组一样,只是数组的元素与普通数组不同,它是同类的若干个对
21、象。类名 数组名大小Sample Array5;第41页/共50页2023/3/23构造函数和析构函数构造函数构造函数功能:在创建对象时使用给定的值将对象初始化。构造函数的特点:(1)构造函数是成员函数,函数体可放在类体内,也可放在类体外。(2)构造函数是一个特殊的函数,该函数的名字与类名相同,且不指定类型说明,它有隐含的返回值,该值由系统内部使用。该函数可以有一个参数,也可以有多个参数第42页/共50页2023/3/23构造函数和析构函数(3)构造函数可以重载,即可以定义多个参数不同的函数。(4)程序中不能直接调用构造函数,在创建对象时系统自动调用构造函数。和一般成员函数类似,类的构造函数可
22、以带有参数,也可以重载,构造函数的重载表示类对象的不同的初始化方式。不带任何参数的构造函数为默认构造函数。第43页/共50页2023/3/23示例程序一class Sampleint n;public:Sample()n=0;Sample(int i)n=i;void disp()cout“n=”nendl;;void main()Sample s1,s2(10);s1.disp();s2.disp();第44页/共50页2023/3/23示例程序一说明类Sample中定义了两个构造函数,在main函数中定义Sample类的两个对象时自动调用相关的构造函数。定义s1时因不带参数,调用构造函数1
23、;定义s2时因带有参数,调用构造函数2。该程序执行的结果是n=0,n=10如果一个类中没有定义任何构造函数,则编译系统会自动生成一个不带参数的默认构造函数:类名:默认构造函数名()第45页/共50页2023/3/23构造函数和析构函数拷贝构造函数功能:用一个已知的对象来初始化一个被创建的同类的对象。拷贝初始化构造函数实际上也是构造函数。它是在初始化时被调用来将一个已知对象的数据成员的值拷贝给正在创建的另一个同类的对象拷贝构造函数的特点:1,函数名同类名,因为它也是一种构造函数,并且该函数也不被指定返回类型2,函数只有一个参数,并且是对某个对象的引用。3,每个类都必须有一个拷贝构造函数,其格式如
24、下:类名:拷贝构造函数(类名&引用名)第46页/共50页2023/3/23构造函数和析构函数析构函数功能:释放一个对象。在对象删除前,用它来做一些清理工作,它与构造函数的功能正好相反。析构函数不能重载。特点:1,析构函数是成员函数,函数体可以放在类体内,也可以放在类体外。2,定义形式类名()3,一个类中最多定义一个析构函数4,析构函数可以被调用,也可以由系统调用。在下面两种情况下,析构函数会被自动调用。如果一个对象被定义在一个函数体内,则当这个函数结束时,该对象的析构函数被自动调用。使用new运算符动态创建一个对象后,当使用delete运算符释放它时,delete将会自动调用析构函数。第47页/共50页2023/3/23Thank You!第48页/共50页2023/3/23第49页/共50页2023/3/23感谢您的欣赏!第50页/共50页