




已阅读5页,还剩372页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C+程序设计,吉林大学软件学院,教师邮箱:liay参考书:C+程序设计教程钱能清华大学出版社第2版课堂纪律:上机:,第一章:概述,1-1培养目标理解和掌握c+语言的基本语义和语法,初步理解面向对象的思想,初步掌握面向对象的程序设计方法。提高编程能力和调试程序的能力,为后面的学习打好基础。,1-2C语言与C+语言,C语言回顾:1972年bell实验室研制C语言特点:高度灵活性、实现上的高效性(比FORTRAN)简捷和高效(比Pascal),C语言局限:程序达到一定规模时,模块之间的协调性存在问题,程序的重用性也存在问题,程序员难以控制程序的复杂性。,C+产生:1980年贝尔实验室BjanreStroustrup对C改进与扩充最初称为“带类的C”,(cwithclasses).1983年正式命名为C+3次修订后1994年制定了ANSIc+草案1998年11月,ISO标准被批准。,C+是C的改进与扩充C+包括C的全部属性、特征、优点,是在C的基础上的改进与扩充C+是C语言改进的基础上,添加了对面向对象程序设计部分的支持C+包括过程性语言和类部分C+是C的超集,C是C+的子集C+是混合型语言,即是过程型的,又是面向对象型的,1-3面向过程的程序设计,“面向过程”是一种以事件为中心的编程思想。就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。,1-4面向对象程序设计的基本特征,1.对象一个对象是客观世界的一个实体数据与数据处理过程作为一个整体对象C+采用“类”来支持对象,同类对象抽象出其共性,形成类,类封装了数据与处理数据的过程(函数),2.继承与重用举例C+采用继承支持重用。可通过继承现有类,并对其进行扩展,生成新类,即新类是从现有类派生出来的,成为派生类。,3.多态性:多态性指同一个操作在不同的类上有着不同行为。,1-5:举例比较面向对象和面向过程程序设计,例如五子棋,面向过程的设计思路就是首先分析问题的步骤:1、开始游戏,2、黑子先走,3、绘制画面,4、判断输赢,5、轮到白子,6、绘制画面,7、判断输赢,8、返回步骤2,9、输出最后结果。把上面每个步骤用分别的函数来实现,问题就解决了,而面向对象的设计则是从另外的思路来解决问题。整个五子棋可以分为:1、黑白双方,这两方的行为是一模一样的,2、棋盘系统,负责绘制画面,3、规则系统,负责判定诸如犯规、输赢等。第一类对象(玩家对象)负责接受用户输入,并告知第二类对象(棋盘对象)棋子布局的变化,同时利用第三类对象(规则系统)来对棋局进行判定。,面向过程和面向对象不是对立的面向过程和面向对象将长期并存从程序机构上,c+的单一程序体本质上是基于过程的,因为运行程序时,总是启动过程。,/*thisisasimplec+program*/#includeusingnamespacestd;/#includeintmain()inta,b,result;coutab;result=3*a-2*b+1;coutresultisresultc,此处inline可省略,内联函数的函数体限制:内联函数中,不能含有switch和while。递归函数不能用来做内联函数。内联函数中不能说明数组。否则,按普通函数调用那样产生调用代码。(内联函数是建议性,不是指令性)内联函数只适合于1-5行的小函数类结构中所有在类内部定义的函数,都是内联函数。,2-2重载函数,intabs(int);longl_abs(long);doubled_abs(double);重载函数:intabs(int);longabs(long);doubleabs(double);C+用一种函数名技术可准确的判断出应使用那一个函数。abs(-10);/调用intabs(int);abs(-1000000);/调用longabs(long);abs(12.3);/调用doubleabs(double);,简化编程,在编程逻辑上,亲近了人类的思维,在同一作用范围中为多个函数定义(其功能通常是相近的)指定一个共同的函数名,委托编译器根据每一个单独函数的形参个数、类型和位置的差异,在幕后进行名称细分并选择合适的函数调用匹配的现象称为函数重载。voidprint(double);voidprint(long);voidprint(double,char*);voidprint(char*,double);voidf()print(1L);/print(long)print(1.0);/print(double)print(2.0,”hello”);/print(double,char*)print(”hello”,3.0);/print(char*,double),让重载函数执行不同的功能,是不好的编程风格。,匹配重载函数的顺序:(1)严格匹配(2)内部转换(相容类型匹配)(3)通过用户定义的转换寻找求一个匹配。voidprint(int);voidprint(double);voidfunction()print(3);print(5.0);print(a);print(3.1415f);,voidprint(long);voidprint(double);voidfunction()inta;print(a);/有二义性,print(long(a);或者print(double(a);,重载的内部实现:C+用名字粉碎(namemangling)(名字细分、名字压轧)的方法来改变函数名。用v,c,i,f,l,d,r分别表示void,char,int,float,long,double,f(chara);/f_cintf(chara,intb,doublec);/f_cid,返回值类型不能够作为重载依据(区分、细分重载)voidfunc(int);intfunc(int);fucn(10);/error这样规定保证对重载的解析与环境无关floatsqrt(float);doublesqrt(double);voidf(doubleda,floatfla)floatfl=sqrt(da);/调用sqrt(double)doubled=sqrt(da);/调用sqrt(double)fl=sqrt(fla);/调用sqrt(float)d=sqrt(fla);/调用sqrt(float),2-3默认参数的函数,默认参数也称为缺省参量。例:voiddelay(intloops);voiddelay(intloops)if(loops=0)return;for(inti=0;iloops;i+);允许函数默认参数值,是为了让编程简单,让编译器做更多的检查错误工作。默认参数函数的声明当又有声明又有定义时,定义中不允许默认参数。若只有定义,则默认参数才可出现在函数定义中,将loops定义成默认值为1000voiddelay(int=1000);调用时:delay();delay(2000);,默认参数的顺序规定:一个函数中可以有多个默认参数,默认参数应从右至左逐渐定义,当调用函数时,从左向右匹配参数。例:voidfoo(inta,intb,boolc);voidfoo(inta,intb,boolc=false);/ok,c是最后一个参数voidfoo(inta,intb=0,boolc);/fail,b不是最后一参数,当调用有默认参数的函数时,从左向右匹配参数。#includeusingnamespacestd;voidfun(inta=1,intb=3,intc=5)couta=a,b=b,c=c,endl;intmain()fun();fun(7);fun(7,9);fun(7,9,11);cout100)print(arr);elseprint();return0;,voidprint(int*pa)coutthearraycanbeusedendl;for(inti=0;i10;i+)coutpai;coutendl;voidprint()coutthearraycannotbeusedendl;,无名参数函数的定义和声明中,都可以省略形参名.voidprint(int,int);voidprint(inta,int)coutaendl;voidfunc()print(1,2);,2-4:程序运行时的内存布局,(1)代码区(codearea):存放程序的代码(各个函数的代码块)(2)全局变量区(dataarea):存放程序的全局数据和静态数据(3)堆区(heaparea):存放程序的动态数据可以用malloc()与free()以及new和delete来申请与释放堆内存,也称动态内存、动态数据区。(4)栈区(stackarea):存放程序的局部数据(各个函数中的数据),3-1:指针1.指针变量的定义与赋值指针是一种数据类型,用于存放内存单元的地址。int*ip;定义同时赋值:inta;int*p=,第三章:指针和引用,3.与地址相关的运算*和“p=a;for(i=0;i6;i+)printf(“%d”,_);ai*(a+i)pi*(p+i)*p+*a+考虑:的作用和*的比较;越界访问数组名和指针,(1)数组名的内涵在于其指代实体是一种数据结构,这种数据结构就是数组;(2)数组名的外延在于其能够转换为指向其指代实体的指针,而且是个指针常量;(3)数组名作为函数形参时,在函数体内,其失去了本身的内涵,仅仅只是个指针;,#includeusingnamespacestd;voidarrayTest(charstr)/char*str,charstr10coutsizeof(str)endl;cout+strendl;intmain()charstr110=“Yandme”;arrayTest(str1);return0;,5.void指针与NULL指针值(1)void指针(void*p)空类型指针不指向任何类型,仅仅是一个地址。不能进行指针运算,也不能进行间接引用。*p其他类型指针可以赋值给空类型指针空类型指针经显示转换后方可赋给其他指针。inta=30;int*ip=,(2)NULL是空指针值,不指向任何地方。任何类型的指针都可以赋该值。int*ptr=NULL;int*ptr=0;NULL与void*是不同的概念,6.指针和常量const说明符const为指定说明符(也称为常类型说明符),使用指定时,程序执行的过程中指定的内容不能被改变(冻结)。即一次初始化后,指定的内容始终不变。(1)定义一般常量使用const说明常量:intconstx=2;或constintx=2;定义或说明一个常数组可采用如下格式:const或者constdoubleconsta2=1.0,2.0常量定义时,应被初始化。constinti5;i+;(错误);constinti;必须初始化;C中常量定义用#definePI3.14159c+中使用constdoublePI=3.1415;积极使用const,避免使用宏,可以用const、enum定义常量。,(2)指针常量和常量指针(指向常量的指针)指针常量:在指针定义语句的指针名前加const,表示指针本身是常量。inta;int*constp=均可。以上定义表明,*pi是常量,不能将*pi作为左值进行操作。定义指向常量的指针时,定义时不必须先初始化。,例:指针常量inta10;int*constp=a;intb6;p=b;/错误*p=6;/正确*(p+6)=6;/正确*p+7;/错误constintc0;int*constq/错误(a本身不能被修改就不允许外界提供修改的漏洞),(3)指向常量的指针常量(常量指针常量)形式:constint*constp,重载和const形参(1)voidf(int*p);voidf(constint*cp);/有效重载,是不是指向const对象(2)voidf(int*p);voidf(int*constpc);/无效重载,重定义不能基于指针本身是否const实现重载,7.堆内存的分配1堆内存(heap):堆是一块内存区域,堆允许程序在运行时(而不是编译时),申请某个大小的内存空间。堆内存又称为动态内存。2获得堆内存c中用函数malloc()(在头文件malloc.h中)来获得堆内存;c+中用操作符new来获得堆内存。3释放堆内存c中用函数free()(在头文件malloc.h中)来释放堆内存;c+中用操作符delete来释放堆内存。,使用malloc申请空间void*malloc(unsignedlongsize);例:#include“stdio.h”#include“malloc.h”intmain()int*p,i;p=(int*)malloc(10*sizeof(int);for(i=0;i10;i+)scanf(“%d”,p+);p-=10;for(i=0;i10;i+)printf(“%d”,pi);free(p);/只能释放malloc申请的空间return0;,使用new和delete进行动态内存分配和释放运算符new和delete是C+新增的运算符,提供了存储的动态分配和释放功能。它的作用相当于C语言的函数malloc()和free(),但是性能更为优越。使用new和delete:(1)new类型(初始化值);int*p;p=newint(100);/动态分配一个整数并初始化deletep;(2)new类型数组大小int*p;p=newint10;/分配一个含有10个整数的整形数组deletep;/删除这个数组使用new较之使用malloc()有以下的几个优点:(1)new自动计算要分配类型的大小,不使用sizeof运算符,比较省事,可以避免错误。(2)自动地返回正确的指针类型,不用进行强制指针类型转换。(3)可以用new对分配的对象进行初始化。(4)不用使用头文件声明(malloc.h),更简洁。,include“stdio.h”intmain()int*p,i;p=newint10;for(i=0;i10;i+)scanf(“%d”,p+);p-=10;for(i=0;i10;i+)printf(“%d”,pi);deletep;/只能释放new申请的空间return0;,new操作符若申请成功,返回首单元地址;否则返回NULL值。int*p=newint10;if(p=NULL)/if(!p)或者if(p=0)cout“cantallocatemorememory!n”;exit(1);/exit是在调用处强行退出程序/exit(1)表示异常退出.exit(0)表示正常退出,动态空间:动态申请二维数组#include“stdio.h”intmain()int*p,i,j;p=newint*3;for(i=0;i3;i+)pi=newint3;for(i=0;i3;i+)for(j=0;j3;j+)scanf(“%d”,*(p+i)+j);for(i=0;i3;i+)for(j=0;j3;j+)printf(%d,pij);for(i=0;i3;i+)deletepi;deletep;return0;,8.函数指针和指针函数(1)指针函数:返回指针值的函数。定义格式:类型修饰符*函数名(形参表)函数体int*f(inta);(2)函数指针:指向函数地址(程序区)的指针。与函数名等价的指针。函数名是指向函数的指针常量。函数指针定义若函数原型为:类型函数名(形参表);则相应函数指针定义为:类型(*变量名)(形参表);/()的优先级大于*char*p(int);char(*p)(int);例:intf1(intn);int(*pf1)(intn);pf1=f1;/pf1是与f1等价的函数指针指针函数用来申请空间或者查找数据;函数指针用来临时制定参与运算的函数;,(3)通过函数指针来调用函数例:intadd(inta,intb)returna+b;intmain()int(*p)(int,int);p=add;/p是与add等价的函数指针coutadd(3,5);cout(*p)(3,5);/四种调用形式效果等价coutp(3,5);cout(*add)(3,5);return0;结果:8888,4函数指针作函数形参例:计算以0.10为步长,特定范围内的三角函数之和。#includeusingnamespacestd;#includedoublesigma(double(*func)(double),doubledl,doubledu)doubledt=0.0;for(doubled=dl;ddu;d+=0.1)dt+=func(d);returndt;intmain()doubledsum;dsum=sigma(sin,0.1,1.0);coutthesumofsinfrom0.1to1.0isdsumendl;dsum=sigma(cos,0.5,3.0);coutthesumofcosfrom0.5to3.0isdsumendl;return0;,5.用typedef来简化函数指针(1)typedefint(*FUN)(inta,intb);intf(int,int);FUNfunp=f;FUN不是指针变量,是指针类型名。(2)typedefintFUNC(int,int);/先定义函数类型FUNC*funp=f;6.函数的返回类型可以是函数指针typedefint(*SIG)();typedefvoid(*SIGARG)();SIGsignal(int,SIGARG);,3-2引用,1.引用(reference)的概念为一个变量、函数等对象规定一个别名,该别名称为引用。此后,对别名的操作即是对别名所代表的对象的操作。,对象:存储器中一片连续的区域;*(a+10)=7左值:就是引用某个对象的表达式,2声明引用:声明引用格式如下:格式:类型标识符/rp2代表p所指向的那个对象,/即数组元素a0,3引用必须初始化。引用一旦被声明则不能再修改.Intj,k;int,void/errorvoid本质不是一个类型,只是在语法上相当于一个类型,没有该类型的对象。,4、引用的使用参数传递voidswap(int,形参和实参结合规则:形参为引用时,形参(引用)接收实参(对象)的地址。或表述为:形参为引用时,凡遇到形参(引用)的地方,全部用实参(对象)来代替。传递引用给函数与传递指针的效果相同。可读性比指针传递好(传值方式的调用与可读性,性能却强于传值方式)参数结合符合初始化标准可使用引用传递从函数返回多个值(指针和引用都可以),5.引用和指针的关系指针是个变量,可再赋值;而引用建立时必须进行初始化并且决不会再关联其它不同的变量。指针操纵两个实体(指针值、指向的值);引用只能操纵一个实体。引用在内部用指针实现,被看成是指针常量,不能操作自身的地址值,只能访问所指向的实体。在语言层面,引用的用法和对象一样;在二进制层面,引用一般都是通过指针来实现的,只不过编译器帮我们完成了转换实际上“引用”可以做的任何事情“指针”也都能够做,为什么还要“引用”?答案是“用适当的工具做恰如其分的工作”。指针能够毫无约束地操作内存中的东西,尽管指针功能强大,但是非常危险。引用是指针出于安全考虑的替代品。,在以下情况下你应该使用指针:一是你考虑到存在不指向任何对象的可能(在这种情况下,你能够设置指针为空)二是你需要能够在不同的时刻指向不同的对象(在这种情况下,你能改变指针的指向)。如果总是指向一个对象并且一旦指向一个对象后就不会改变指向,那么你应该使用引用。,6.用const限定引用用const限定引用声明方式:Inti;constint效率相同,double注意:c+不分变量的const引用,和const变量的引用,因为引用本身就不能重新赋值,使它指向另一个变量。即没有constintconstfloatf1(floatr)floatk;k=3.14*r*r;coutf1:kis的前面是地址,成员函数的调用一定是和某个对象捆绑在一起,一个类的一般构造:classclass_name_identifierpublic:公共数据成员声明语句;公共函数成员声明语句;private:私有数据成员声明语句;私有函数成员声明语句;protected:保护数据成员声明语句;保护函数成员声明语句;;,C+中类与结构的区别structSavingspublic:/可省略floatdeposit(floatamount)balance+=amount;returnbalance;private:intaccountnumber;floatbalance;,classSavingsprivate:/可省略intaccountnumber;floatbalance;public:floatdeposit(floatamount)balance+=amount;returnbalance;,C+中类与结构的区别:默认情况下,class定义的成员是private的,而struct定义的成员是public的。,2.对象的引用以及返回对象的函数classStudentpublic:intage;charname9;floatscore;intmain()voidadd(Student,voidadd(Student,3.公有,intmain()Studenta;a.p();a.q();a.score=80;a.age=20;/错误a.add();/错误a.r(5);a.r(int)(a.score);a.r(a.age);/错误return0;,4.成员函数,voidp(inta)couta;intmain()Studenta;a.p();p(a.q();return0;,成员函数与普通函数的区别:成员函数属于类,成员函数定义是类设计的一部分,其作用域是类作用域.而普通函数一般为全局函数成员函数的操作主体是对象,使用时通过捆绑对象来行使其职责,而普通函数被调用时没有操作主体,5.重载成员函数classStudentpublic:floatgrade()/floatgrade(floatnewgpa)/protected:/.;classSlopepublic:floatgrade()/protected:/.;chargrade(floatvalue)/,voidmain()Students;Slopet;s.grade(3.2);floatv=s.grade();charc=grade(v);floatm=t.grade();,6.定义成员函数(1)在类的内部定义成员函数#includeusingnamespacestd;classTdatepublic:voidset(intm,intd,inty)month=m;day=d;year=y;intisleapyear()return(year%4=0,intmain()Tdatea;a.set(2,4,1998);a.print();if(a.isleapyear()coutisleapyear!“elsecout“isnotleapyear!;return0;,Set与month全名:作用域区分符、作用域运算符、名字空间引导符,例:用:表示全局变量和函数intmonth;intday;intyear;voidset(intmonth,intday,intyear):month=month;:day=day;:year=year;classTdatepublic:voidset(intm,intd,inty):set(m,d,y);private:intmonth;intday;intyear;,类内部提供的成员函数定义默认为内联函数。类中定义的成员函数一般规模较小(1-5句)不能使用结构化语句类定义一般在头文件中,便于多个程序使用。,/例子文件名Student.hclassStudentpublic:voidp()age=19;coutage;floatscore;protected:charname;intage;,a.cpp#include“Student.h”main()Studenta;a.p();b.cpp#include“Student.h”voidhh()Studenta;a.p();/类定义和使用的分离,(2)在类之后定义成员函数classTdatepublic:voidset(intm,intd,inty);intisleapyear();voidprint();private:intmonth;intday;intyear;,voidTdate:set(intm,intd,inty)month=m;day=d;year=y;intTdate:isleapyear()return(year%4=0voidTdate:print()coutmonth“/”day“/”yearendl:,类定义和成员函数定义的分离/tdate.h(类的定义)classTdatepublic:voidset(intm,intd,inty);intisleapyear();voidprint();private:intmonth;intday;intyear;:,/tdate.cpp(类的实现)#includeusingnamespacestd;#include“tdate.h”voidTdate:set(intm,intd,inty)month=m;day=d;year=y;intTdate:isleapyear()return(year%4=0voidTdate:print()coutmonth“/”day“/”yearendl:,/pmain.cpp#include“tdate.h”intmain()Tdatea;a.set(2,4,1998);a.print();,从上图中观察可以得知:1,整个源程序由3个单独的文件构成。2,两个.cpp文件分别编译生成各自目标文件。3,两个目标文件和库文件连接生成可执行程序。,tdate.cpp#include#includetdate.h,tdate.h,Pmain.cpp#includetdate.h,tdate.obj,Pmain.obj,可执行文件pmain.exe,编译,编译,连接,连接,注意::用于c+提供的头文件,一般存放在c+系统目录中的include子目录下“”:首先在当前文件所在的目录中进行搜索,找不到,再按标准方式进行搜索.,/成员函数的实现和类定义一起放在头文件中文件名Student.hclassStudentpublic:voidp(void);floatscore;protected:charname;intage;voidStudent:p()coutage/直接放在了h文件中,文件名aa.cpp#includestudent.h”voidmain()voidf();Studenta;a.score=80;couta.score;a.p();f();文件名bb.cpp#includestudent.h“voidf()Studenta;a.score=90;a.p();/提示voidStudent:p()被重复定义,c+的名称有外部链接:函数定义,可以在其他文件中使用。不能重复定义。内部链接:只能在自己的程序中使用,可以跨文件重复定义。如:类型定义、全局常量、inline函数、模板定义等。,/头文件在一个文件中多次被包含文件名Student.hclassStudentpublic:voidp()coutscore;floatscore;protected:charname;intage;,文件名ss.h#includestudent.hclasssspublic:Student*a;floatf;文件名bb.cpp#include#includestudent.h#includess.hvoidmain()Studenta;sss;a.score=80;ss.f=50;/提示Student类被重复定义,头文件卫士文件名Student.h#ifndefSTUDENT#defineSTUDENTclassStudentpublic:voidp()coutscore=5;/错误return0;,/程序中显式使用this指针/Student.hclassStudentpublic:Student*p(void);Student,/Student.cpp#includestudent.hStudent*Student:p()age=age+2;return(this);Student,9.类的封装类的封装的概念首先是数据与算法(操作)结合,构成一个不可分割的整体。其次是在这个整体中一些成员是保护的,他们被有效地屏蔽,以防外界的干扰和误操作。另一些成员是公共的,他们作为接口提供给外界使用。,保护(私有)成员类的成员可以声明为被保护的(protected、private),从类的外部(指在普通函数或其它类的成员函数中)不能对他们访问一般将所有的数据成员指定为保护。(1)保护类的内部数据不被肆意侵犯(2)是类对它本身内部实现的维护负责,因为只有类自己才能访问该类的保护数据,所以对一切保护数据的维护只有靠类自己。(3)限制类与外部世界的接口。保护成员对使用者不可见。(4)减少类与其它代码的关联程度。类的功能是独立的,不依赖于应用程序的运行环境。,公共成员(公共接口、对外接口)需要让外界调用的成员函数指定为公共的,外界通过公共的函数来实现对数据的操作。外界与类的唯一联系就是调用公共的成员函数。在类外不能访问私有数据成员,但是可以通过公共成员函数来修改私有数据成员的值。,/point.hclasspointpublic:/外部接口voidSet(doubleix,doubleiy);doublexOffset();doubleyOffset();doubleangle();doubleradius();protected:/内部数据doublex;doubley;/doublea;/doubler;,/point.cpp(类的内部实现)#includepoint.h#includevoidpoint:Set(doubleix,doubleiy)x=ix;y=iy;doublepoint:xOffset()returnx;doublepoint:yOffset()returny;doublepoint:angle()/计算极坐标return(180/3.14159)*atan2(y,x);doublepoint:radius()/取极坐标半径returnsqrt(x*x+y*y);,保护成员不是外部接口部分,但为了类定义的整体描述,只好把它放在头文件中。对于面向对象程序设计之严格的内外界面描述来说,是c+类机制中无可奈何的一面。但它不妨碍类的外部接口的有效性。,9.屏蔽类的内部实现/Point.h(公用接口)classPointpublic:voidSet(doubleix,doubleiy);doublexOffset();doubleyOffset();doubleangle();doubleradius();protected:doublex;doubley;/doublea;/doubler;,/Point.cpp#include“Point.h#includevoidpoint:Set(doubleix,doubleiy)x=ix;y=iy;doublepoint:xOffset()returnx;doublepoint:yOffset()returny;doublepoint:angle()/计算极坐标return(180/3.14159)*atan2(y,x);doublepoint:radius()/取极坐标半径returnsqrt(x*x+y*y);,/main.cpp#include“Point.h#includeusingnamespacestd;intmain()Pointp;doublex,y;for(;)coutxy;if(x0)break;p.Set(x,y);coutangle=p.angle()radius=p.radius()xOffset=p.xOffset()yOffset=p.yOffset()endl;,/Point.cpp(私有实现)#include“Point.h#includevoidpoint:Set(doubleix,doubleiy)a=atan2(ix,iy);r=sqrt(ix*ix+iy*iy);doublepoint:xOffset()returnr*cos(a);doublepoint:yOffset()returnr*sin(a);doublepoint:angle()return(180/3.14159)*a;doublepoint:radius()returnr;,结论:类很好的屏蔽了内部数据表示,所以由类负责的内部实现上的维护不影响程序的开发,这大大减轻了开发应用程序的强度。,/Point.hclassPointpublic:voidSet(doubleix,doubleiy);doublexOffset();doubleyOffset();doubleangle();doubleradius();protected:/doublex;/doubley;doublea;doubler;,10.作用域(1)变量的作用域内或其后的全部内容inta=1;main()voidf();couta;inta=2;couta;inta=3;couta;couta;f();couta;voidf()couta;inta=4;couta;,(2)类的作用域类作用域包括类定义作用域和类实现作用域.类的定义作用域是指类定义和相应的成员函数定义范围。在该范围内,一个类的成员函数对同一类的数据成员具有无限制的访问权。私有成员和受保护成员只能被类内部的成员函数访问;公有成员是类提供给外部的接口,可以在类外部被访问.这种技术实现了信息的隐藏和封装.类的实现作用域通过类的对象体现,对象有全局对象、局部对象等作用范围。,(2)可见性可见性与作用域是一致的。可见性从另一角度表现标识符的有效性,标识符在某个位置可见,表示该标识符可以被引用。可见性在分析两个同名标识符作用域嵌套的特殊情况时非常有用。当内层的变量和外层的变量同名时,在内层里,外层的变量暂时地失去了可见性。/例子inta=0;/-全局变量,并且初始化为0voidfunc()inta;a=100;coutaendl;cout:aendl;voidmain()coutaendl;“不能在同一作用范围内有同名变量”。上面的代码中,定义了两个a,但并不违反这一规则。因为二者处于不同的作用范围内。,类名与其它变量名或函数名相同的情况类名允许与其它变量名或函数名相同,通过如下方法来正确访问:1)如果一个非类名隐藏了类名,则类名通过加前缀即可。classSample/.;voidfun(intSample)classSamples;/定义一个对象要加前缀Sample+;/2)如果一个类名隐藏了非类名,则用一般作用域规则即可。ints=0;voidfunc()classs/;sa:s=3;/class作用域到此结束intg=s;,在函数中定义的类称为局部类,不多见。作用域在定义该类的函数内。局部类的成员函数必须在类定义内部定义。,(3)生命期(生存期)指一个对象产生后,存活时间的度量。在生存期内,对象保持它的状态。整个程序的生命期:全局(静态)数据静态生命期:静态局部数据局部生命期:动态生命期:由new申请到内存空间之后,该空间实体开始有效,一直到delete释放该内存空间。,/动态生命期#includeint*fn()int*ap=newint;/ap指向的内存空间开始有效returnap;intmain()int*bp=fn();*bp=15;cout*bpn;deletebp;/bp即ap所指,空间释放。return0;,11名字空间,namespacezhsclassaapublic:voidaa1(inta=1)id=a;intid;intage;doublescore;namespacelsclassaapublic:intage;,名字空间的作用是建立一些互相分隔的作用域,把一些全局实体分隔开来,以免产生名字冲突。,voidmain()ls:aaa;zhs:score=90.1;zhs:aab;b.aa1(8);a.age=5;zhs:age=6;couta.ageb.idendl;,可以包含:变量classzhs:aapublic:voidaa1(inta=1)id=a;intid;namespacezhsintage;/仍然是全局变量,隐藏在指定的名字空间而已doublescore;intmain()zhs:aaa;zhs:age=4;zhs:score=90.5;a.id=3;couta.idzhs:scorezhs:ageendl;return0;,外定义,合并定义,名字空间,namespacezhsclassaapublic:voidaa1(inta=1)id=a;intid;intage;doublescore;namespacelsvoida()coutComputerendl;Intmain()zhs:score=90.1;coutzhs:scoreendl;ls:a();return0;,包含函数,名字空间,namespacezhsclassaapublic:voidaa1(inta=1)id=a;intid;intage;doublescore;voidf()age=1;score=80.5;namespacelsvoida();voidls:a()coutzhs:ageendl;intmain()zhs:f();ls:a();return0;,替换为:age如何?,名字空间,namespacezhsclassaapublic:voidaa1(inta=1)id=a;intid;intage;doublescore;namespacelsusingzhs:age;voida();voidls:a()coutageendl;intmain()ls:a();return0;,名字空间,namespacezhsclassaapublic:voidaa1(inta=1)id=a;intid;intage;doublescore;namespacelsusingnamespacezhs;voida()age=3;score=80.5;coutageendl;intage=2;intmain()ls:a();coutzhs:age:age;return0;,名字空间,namespacezhangsan118899752classaapublic:voidaa1(inta=1)id=a;intid;intage;doublescore;voida(aap)coutp.idendl;intmain()namespacezhs=zhangsan118899752;zhs:aat;return0;,别名,标准名字空间std标准c+库的所有标识符都是在一个名为std的名字空间定义的。std:coutok调用,课内习题:设计一个名为Rectangle的矩形类,其属性位矩形的左下角与右上角的两个点的坐标,能计算矩形的面积。,课堂练习书P288第一题、第二题作业:钱能P290第四题,classStudentpublic:voidp(void);floatscore;protected:char*name;i
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025浙江中国小商品城集团股份有限公司招聘98人笔试参考题库附带答案详解
- 2025新疆哈密镜儿泉矿业有限责任公司第一批面向社会招聘19人笔试参考题库附带答案详解
- 卸货安全培训课件
- 2025年福建省榕圣建设发展有限公司项目招聘12人笔试参考题库附带答案详解
- 卸油操作安全培训课件
- 2025年佛山市禅城区国有资产监督管理局下属企业招聘工作人员4人笔试参考题库附带答案详解
- 2025山东聊城市市属企业统一招聘24人笔试参考题库附带答案详解
- 2025山东土地资本投资集团有限公司春季社会招聘10人笔试参考题库附带答案详解
- 2025国网西藏电力有限公司高校毕业生招聘约305人(第二批)笔试参考题库附带答案详解
- 2025四川资阳瑞达产业投资集团有限公司招聘9人笔试参考题库附带答案详解
- SYT 6680-2021 石油天然气钻采设备 钻机和修井机出厂验收规范-PDF解密
- 《遗传学》课程标准
- 蛋白质分离纯化及鉴定
- 2024年化粪池清理合同协议书范本
- 实用美术基础中职全套教学课件
- 债权债务法律知识讲座
- 南京财经大学《812西方经济学(宏观经济学、微观经济学)》历年考研真题及详解
- 基于教育培训行业的客户关系营销研究
- 肉制品工艺学-香肠类制品-课件
- 超全QC管理流程图
- 2广告实务课程标准
评论
0/150
提交评论