技能知识培训三_第1页
技能知识培训三_第2页
技能知识培训三_第3页
技能知识培训三_第4页
技能知识培训三_第5页
已阅读5页,还剩47页未读 继续免费阅读

下载本文档

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

文档简介

1、技能知识培训三C+面向对象程序设计Page *目录指针与引用比较函数重载函数指针链表面向对象设计思想类和对象Page *指针与引用比较指针与引用都是间接引用其他对象。首先,要认识到在任何情况下都不能使用指向空值的引用。一个引用必须总是指向某些对象。因此如果你使用一个变量并让它指向一个对象,但是该变量在某些时候也可能不指向任何对象,这时你应该把变量声明为指针,因为这样你可以赋空值给该变量。相反,如果变量肯定指向一个对象,例如你的设计不允许变量为空,这时你就可以把变量声明为引用。 Page *指针与引用比较char *pc = 0; / 设置指针为空值char& rc = *pc; / 让引用指向

2、空值这是非常有害的,毫无疑问。结果将是不确定的(编译器能产生一些输出,导致任何事情都有可能发生)。 Page *指针与引用比较引用必须初始化string& rs; / 错误,引用必须被初始化string s(xyzzy);string& rs = s; / 正确,rs指向s指针没有这样的限制。string *ps; / 未初始化的指针/ 合法但危险Page *指针与引用比较不存在指向空值的引用这个事实意味着使用引用的代码效率比使用指针的要高。因为在使用引用之前不需要测试它的合法性。void printDouble(const double& rd)cout rd; / 不需要测试rd,它 /

3、肯定指向一个double值相反,指针则应该总是被测试,防止其为空:void printDouble(const double *pd)if (pd) / 检查是否为NULLcout *pd;Page *指针与引用比较指针与引用的另一个重要的不同是指针可以被重新赋值以指向另一个不同的对象。但是引用则总是指向在初始化时被指定的对象,以后不能改变。string s1(Nancy);string s2(Clancy);string& rs = s1; / rs 引用 s1string *ps = &s1; / ps 指向 s1rs = s2; / rs 仍旧引用s1,/ 但是 s1的值现在是/ Cla

4、ncyps = &s2; / ps 现在指向 s2;/ s1 没有改变Page *指针与引用比较总的来说,在以下情况下你应该使用指针,一是你考虑到存在不指向任何对象的可能(在这种情况下,你能够设置指针为空),二是你需要能够在不同的时刻指向不同的对象(在这种情况下,你能改变指针的指向)。如果总是指向一个对象并且一旦指向一个对象后就不会改变指向,那么你应该使用引用。还有一种情况,就是当你重载某个操作符时,你应该使用引用。最普通的例子是操作符。这个操作符典型的用法是返回一个目标对象,其能被赋值。vector v(10); / 建立整形向量(vector),大小为10;v5 = 10; / 这个被赋值

5、的目标对象就是操作符返回的值如果操作符返回一个指针,那么后一个语句就得这样写:*v5 = 10;但是这样会使得v看上去象是一个向量指针。因此你会选择让操作符返回一个引用。当你知道你必须指向一个对象并且不想改变其指向时,或者在重载操作符并为防止不必要的语义误解时,你不应该使用指针。而在除此之外的其他情况下,则应使用指针 Page *函数类别内部函数和外部函数内部函数:内部函数时是在定义它的文件中可以被调用的函数,而在同一程序的其他文件中不可调用,定义内部函数的格式如下:static 类型说明 函数名(参数表)函数体; Page *函数类别外部函数:外部函数是作用域在整个程序中的函数,包含组成该程

6、序的若干个文件。外部函数的定义格式如下:extern 类型说明 函数名(参数表)Page *函数重载所谓重载就是赋给同一个函数名不同的含义。 具体的讲,c+中允许在相同的作用域内以相同的名字定义几个不同实现的函数,可以是类成员函数,也可以是普通的函数。但是,定义重载函数时要求同名函数的参数至少有一个类型不同,或者个数不同,否则会造成二义性。而对返回值没有要求。Page *函数指针定义方式数据类型 (*函数名)(参数列表);应用(小学生四则混合运算综合程序设计):要求:一张试卷包含十道题目题目随机产生考生做完后可以查看得分int add(int left,int right)return lef

7、t+right;int sub(int left,int right)return left+right;Page *函数指针int multiply(int left,int right)return left*right;int divide(int left,int right)if(right = 0)return -1;return left/right;Page *函数指针struct Topicint left;char op;int right;int result;int key;bool flag;struct Paperint num;Topic* topics;char

8、 name15;int score;Page *函数指针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;Page *函数指针int getResult(int left,int righ

9、t,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);Page *函数指针void testSystem三cout*小学生四则混合运算;cout*endl;char name15=0;coutname;Paper* paper=createPaper(name);int count=0;for(int i=0;in

10、um;+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-score = count*100/p

11、aper-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; Page *单向链表的实现void print(link* head)while(head != NULL)coutdatanext;void main三link* head=createSingleLink三;print(head);Page *双向表双向链表结点定义struct linkint d

12、ata;/数据域link* prev;/指针域link* next;/指针域;Page *双向表应用举例:有15个人围成一圈,轮流按1,2,3报数,报到3的人退出圈子。下一个人报1,问最后一个人是谁?Page *双向表#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* next;/指针域;Page *双向表link* createDleLink三link* head=

13、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;Page *int getLast(link* phead)int count=N;int step=3;int seq=1;link* head=phead;while(count1)if(seq = step)link

14、* 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;Page *双向表void app三link* head=createDleLink三;coutchgetLast(head)endl;void main三app三;Page *面向对象程序设计思想从现实世界中客观存在的事物(对象)出发来构造系统,并在系统构造中尽可能地运用人类的自然思维方式。Page *以面向对象思

15、想构造软件系统的主要内容1、对象是以面向对象方法构造的系统的基 本单位。对象是对问题域中客观存在的事物的抽象。2、对象的属性和操作组成一个完整的对象, 对象具有一定的对外接口,外界对象可以通过该接口来访问对象。3、以对象为基础,对对象分类,将具有共同特性的对象进行抽象,形成对这些对象的抽象描述类,每个对象就是该类的一个实例。Page *4、对形成的对象类进一步抽象,抽出这些类的共同特征,形成基本的类和派生的类,派生的类又可以具有更多的派生类,这样就形成一个类簇。基本类和派生类的关系称为继承。5、一个系统就是由各个对象组成,对象和 对象之间存在静态关系和动态关系。 静态关系体现了对象之间固有的关

16、系; 动态关系是对象之间通过发送消息进行 通信,相互协作,完成系统功能。Page *面向对象程序方法面向对象方法是利用抽象、封装等机制,借助于对象、类、继承、消息传递等概念进行软件系统构造的软件开发方法。Page *面向对象方法的形成1、面向对象程序设计语言的三阶段发生发展成熟Page *面向对象方法的形成2、Smalltalk语言 Smalltalk是第一个完善的、实用的纯面向对象的语言。它有三个特点:(1)将任何东西都看成对象,包括类本身。对对象的方法的调用在Smalltalk中称为发送消息给对象。Page *Smalltalk语言(2)不进行任何类型检查操作,强调多态性和动态连接。(3)

17、 Smalltalk不仅是一种语言,它还是一个具有类库支持和交互式图形拥护界面的完整的程序设计环境。Page *面向对象程序设计语言的分类(1)纯粹的面向对象程序设计语言 完全依照面向对象思想而设计的,它的所有语言成分都以对象为核心。 如:Smalltalk、Eiffel、Actor和JAVA等Page *面向对象程序设计语言的分类(2)混合的面向对象程序设计语言 在某种已经被广泛使用的其他语言的基础上增加了支持面向对象思想的语言成分。 如:Object C、C+、Object Pascal、和 CLOS等Page *类和对象类的定义格式class 类名public:成员函数或数据成员的说明;

18、private:数据成员或成员的说明;Page *类和对象公有成员:可以被程序中任何代码访问;私有的成员只能被类本身的成员函数及友元类的成员函数访问,其他类的成员函数,包括其派生类的成员函数都不能访问他们:保护的成员与私有成员类似,只是除了类本身的成员函数和说明为友元类的成员函数可以访问保护成员外,该类的派生类成员也可以访问。Page *举例class Aprivate:int i;protected:int j;public:int k;int geti三return i;int getj三return j;int getk三return k; Page *下面是访问类A的对象a中数据成员的

19、各种情况:A a;/定义类A的对象aa.i;/非法,i为A的私有成员a.j;/非法,j为A的保护成员a.k;/合法,k为A的公有成员本例的所有成员函数都是在类体中。若在类体外实现。若在类体外实现,需要使用作用域运算符:,用它来标识某个成员函数是属于哪个类的。该运算符在这里使用的格式如下:类名:函数名(参数表)int A:geti三return i;Page *对象普通对象定义在定义了一个类以后,定义其对象的一般格式如下:类名 对象名表;对象指针定义类名* 对象指针名表;A a1,a2,*p;Page *对象数组对象数组是指数组元素为对象的数组。该数组中若干个元素必须是同一个类的若干个对象。对象

20、数组的定义,赋值和引用与普通数组一样,只是数组的元素与普通数组不同,它是同类的若干个对象。类名 数组名大小Sle Array5;Page *构造函数和析构函数构造函数构造函数功能:在创建对象时使用给定的值将对象初始化。构造函数的特点:(1)构造函数是成员函数,函数体可放在类体内,也可放在类体外。(2)构造函数是一个特殊的函数,该函数的名字与类名相同,且不指定类型说明,它有隐含的返回值,该值由系统内部使用。该函数可以有一个参数,也可以有多个参数Page *构造函数和析构函数(3)构造函数可以重载,即可以定义多个参数不同的函数。(4)程序中不能直接调用构造函数,在创建对象时系统自动调用构造函数。和一般成员函数类似,类的构造函数可以带有参数,也可以重载,构造函数的重载表示类对象的不同的初始化方式。不带任何参数的构造函数为默认构造函数。Page *示例程序一class Sleint n;public:Sle讲义n=0;Sle(int i)n=i;void disp讲义cout“n=”nendl;; void main三Sle s1,s2(10);s1.disp三;

温馨提示

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

评论

0/150

提交评论