C++课件 达内科技内部资料ppt课件_第1页
C++课件 达内科技内部资料ppt课件_第2页
C++课件 达内科技内部资料ppt课件_第3页
C++课件 达内科技内部资料ppt课件_第4页
C++课件 达内科技内部资料ppt课件_第5页
已阅读5页,还剩500页未读 继续免费阅读

下载本文档

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

文档简介

TheC+ProgrammingLanguageChapter1,C+ProgramminginUNIX,课程介绍C+语法基础面向对象程序设计的概念大量的编程实践目标熟练掌握C+语法具有面向对象程序设计的概念与能力能熟练阅读复杂的C+程序源代码能独立的设计与完成面向对象的C+程序,课程内容简介1,C+语言基础保留字变量,常量表达式语句函数程序的结构数据结构与算法数组、指针、引用、结构、链表与栈,课程内容简介2,C+面向对象编程类构造函数与析构函数静态成员与友员函数重载继承与多态I/O流模板异常,程序设计语言介绍1,Whatcomputerunderstand?bitsAssemblerLanguageLimitedstructureGlobalscopeMachinecodePrimitiveHigh-LevelLanguageFunctiondecompositionDataseparationHighlevelstructure,程序设计语言介绍2,BlockStructuredLanguageEncapsulationFlexibledatascopingModularizationObject-OrientedLanguageInheritancePolymorphismAbstractdatatypes,C+程序设计语言,1972,AT/mainfunctionintmain()coutHelloworld!endl;coutThisismyfirstC+program.n;,g的常用参数,-c编译成目标文件.o-o指定输出文件名,输出文件名跟在-o后面,用空格分隔。如果不使用这个选项,缺省的输出文件名为a.out。-g产生有调试信息的可执行文件-w不产生警告信息-l连接指定的库文件-L指定库文件的路径-i要包含的头文件-I头文件的路径-E显示预处理后的程序文件到屏幕上,可以用-o指定输出到文件-S产生汇编程序如果没有c、E、S就会生成可执行文件,编译hello.cc,%g+-chello.cc%ls,连接hello.o,%g+-ohellohello.o%ls%g+hello.o%ls,运行hello程序,%hello%a.out,C+程序的基本结构1,/*thefirstC+program*/#includeusingnamespacestd;/mainfunctionintmain()coutHelloworld!endl;coutThisismyfirstC+program.n;,C+程序的基本结构2,#include与#includeNamespace:提供了一个全局标识符和全局变量所在的作用域。intmain()注释函数函数的调用cout语句,头文件,#include语句#include与#include,使用#includeusingnamespacestd;少用#include,Main函数,main函数的作用StandardC+main()格式:intmain()return0;/thedefaultreturnvalueis0;,注释,C+的注释,基本的输出语句,cout,练习程序hi.cc,#includeusingnamespacestd;intmain()coutHiJian!endl;coutHaveaniceday.endl;return0;,练习程序myself.cc,编写一个程序,打印出自己的:姓名性别年龄家庭住址电话号码爱好每一条信息输出为一行,在hi.cc中使用字符串,#includeusingnamespacestd;intmain()charname=John;coutHiname!endl;coutHaveaniceday.endl;return0;,字符与字符串类型,字符,字符串/字符数组charch=A;charstr120=Helloworld!;charstr2=Haveaniceday!;,不同的main()格式,命令行参数%lsl(orls-al)%vihello.cc在程序中使用命令行参数intmain(intargc,char*argv),命令行参数程序cmdline.cc,#includeusingnamespacestd;intmain(intargc,char*argv)for(inti=0;iargc;i+)coutargvi=argviage;coutyournameis:nameendl;coutYouwereage-2ch;if(ch=y)/notethedifference:if(ch=y)coutgoodendl;elsecouttryagain.endl;,练习程序grade.cc,Thisisyourassignment.,Qintmain()inti;i=5;couti=iendl;i=8;couti=iendl;return0;,另一个使用变量的例子程序,#includeusingnamespacestd;intmain()i=5;/seewhathappenscouti=iendl;i=8;couti=iendl;return0;inti;,变量与变量的size,变量都有类型变量在内存中的大小inti;doubled;coutsizeofiissizeof(i)endl;coutsizeofintissizeof(int)endl;coutsizeofdissizeof(d)endl;coutsizeofdoubleissizeof(double)endl;,程序size.cc,编写一个程序,打印出所有C+基本类型的大小#includeusingnamespacestd;intmain()coutsizeofcharis:sizeof(char)endl;coutsizeofunsignedcharis:sizeof(unsignedchar)endl;coutsizeofsignedcharis:sizeof(signedchar)endl;coutsizeofintis:sizeof(int)endl;coutsizeofunsignedintis:sizeof(unsignedint)endl;coutsizeofsignedintis:sizeof(signedint)endl;coutsizeofshortintis:sizeof(shortint)结合性优先级:seetable3-1inpage35intherecommendedbook1.,运算符的使用,if(demo=2)与if(demo=2)if(2=demo)/左值与右值。if(demo!=2)与if(demo=!2),运算符的优先级,inta=8,b=4,c=5;cout(a%b?b:c);couta%b?b:c;,变量的赋值,赋值表达式变量的初始化一次声明多个变量声明并初始化变量,无符号类型的值,无符号整数类型的回绕unsignedshortintsnum;snum=65535;coutsnum=snumendl;snum=snum+1;coutsnum=snumendl;,有符号类型的值,有符号整数类型的回绕intinum=2147483647;coutinum=inumendl;inum=inum+1;coutinum=inumendl;,常用类型的取值范围,常用类型的取值范围inti=65535;intj=65535;couti*j/9a;unsignedintr;intk;unsignedintj;charstr33;memset(str,0,33);str32=0;r=a;inti=32;,练习程序bin.cc,doj=r;r=r/2;k=j-r*2;if(k)str-i=1;elsestr-i=0;while(r!=0);coutstrendl;,枚举类型,enumcolorRED,GREEN,BLUE,WHITE,BLACK;colortvColor=GREEN;Enumconstantvariabledoesnotneedmemoryallocation.ThedefaultvalueinEnumis:0,1,2,3,4.Specifytheelementvalues:enumcolorRED=100,GREEN=200,BLUE,WHITE=300,BLACK=400,表达式,左值与右值floata;a=5/2;+a;求值顺序特殊表达式:(?:)逗号表达式:inta,b,c;a=1,b=a=2,c=b+3;,表达式的求值顺序,求值顺序副作用,表达式的左值与右值,inta,b,c,d;inte=(a=1,b=a,c=a+b,d=c+5);(a=1,b=a,c=a+b,d=c+5)=8;e=(a=0,b=a+5,b+2);(a=0,b=a+5,b+2)=9;/ohps,youmaygetproblem.,练习程序comma.cc,#includeusingnamespacestd;intmain()inta,b,c,d;inte=(a=1,b=a,c=a+b,d=c+5);(a=1,b=a,c=a+b,d=c+5)=8;coutd=dendl;,程序语句,控制语句表达式语句空语句语句块,控制语句,条件判断语句if()if()else循环控制语句while()dowhile();for()多路选择语句switch()case:,循环语句,for语句dowhile语句while语句break语句continue语句,分支语句,switch语句switch(ss)case1:break;case2:break;default:break;,循环语句程序例子chengFa.cc,编写一个程序,打印出乘法口诀表分别使用for语句,dowhile语句,while语句来实现,Theoutputis:1x1=11x2=2,2x2=41x3=3,2x3=6,3x3=91x4=4,2x4=8,3x4=12,4x4=161x5=5,2x5=10,3x5=15,4x5=20,5x5=251x6=6,2x6=12,3x6=18,4x6=24,5x6=30,6x6=361x7=7,2x7=14,3x7=21,4x7=28,5x7=35,6x7=42,7x7=491x8=8,2x8=16,3x8=24,4x8=32,5x8=40,6x8=48,7x8=56,8x8=641x9=9,2x9=18,3x9=27,4x9=36,5x9=45,6x9=54,7x9=63,8x9=72,9x9=81,练习程序year.cc,Thisisyourassignment.判断输入的年份是否是闰年。,Qvoiddisp(charstr)coutThisisyourstring:strendl;intmain()charcourse1=C+;charcourse2=Java;charcourse3=Oracle;charcourse4=UNIX;disp(course1);disp(course2);,函数声明,函数名();voiddisp(char*);floataverage(int,int);floataverage(inta,intb);为什么需要函数声明?,调用函数,函数的形参函数的调用过程填入值参获得返回值,栈的技术简介,栈的工作原理函数的调用与栈,栈的原理,i=f1();j=f2();coutiendl;coutjendl;,coutf1()endl;coutf2()endl;,#includeusingnamespacestd;intf1();intf2();intmain()inti,j;i=f1();j=f2();coutiendl;coutjn;intm=bigsum(n);coutThesumis:m;coutendl;,练习程序nbang.cc,使用递归函数,编写一个程序来求n!的值:Thisisyourassignment,函数的重载,C+中的函数可以重载什么是函数的重载:对于在不同类型上作不同运算而又用同样的名字的情况,称为重载。函数重载的注意事项:重载函数至少在参数个数,参数类型,或参数顺序上有所不同。,函数重载的例子,求两个数的平均值doubleAverage(int,int);doubleAverage(float,float);doubleAverage(double,double);doubleAverage(long,long);,思考题,在一个程序中定义了这两个函数会怎样?intArea(intwidth,intlength=1);intArea(intsize);,Area.ccsourcecode,#includeusingnamespacestd;intArea(intwidth,intlength=1)returnwidth*length;intArea(intsize)/intArea(intsize,intleng)isnotallowedreturnsize*size;intmain()coutArea(3,5)endl;/setlength=5instead.coutArea(10)endl;/isthisok?,函数参数的const限定,可以使用const限定词来修饰形参以保护实参不被修改。const形参的意义#includeusingnamespacestd;voiddisp(constintI)coutIline;intch=0;for(inti=0;istrlen(line);i+)ch+=linei;coutThehashofyourstringis:chendl;,练习程序mywc.cc,输入一行文字,统计单词的个数。为了输入的时候能包含空格,程序使用了getline函数。#includeusingnamespacestd;intmain()coutPleaseenteraline:endl;charline120;intcnt=0;cin.getline(line,120);inti=0;,练习程序mywc.cc,while(istrlen(line)if(linei!=)cnt+;while(linei!=),Q下标是数组元素到开始的偏移量数组下标从0开始charbuf4;,数组2,数组在声明时,元素个数必须是常量或常量表达式charbuf10;intI;charbufI;/?intI=10;charbufI;/?constinti=10;charbufi;charbufi+1;,数组3,如果数组的声明带有初始化,可以直接对整个数组赋值访问数组元素,使用下标操作符intiA10;iA0=0;iA1=1;intI=0;I=iA0+iA1;,数组的初始化,在声明的时候就初始化intiA5=0,1,2,3,4;intiB=1,2,3;使用赋值语句初始化数组iA0=0;iA1=1;数组的边界问题intiC5;iC10=100;/runtime?Question:doesC+compilerhavearrayboundchecking?,数组程序例子,编写一个程序,从键盘接受一个字符串,将该字符串颠倒顺序,然后打印出来,练习程序findmax.cc,#includeusingnamespacestd;intmain()intiA=103,5,68,115,32,23,66,599,38,444;for(inti=0;i10;i+)for(intj=0;ji;j+)inttemp;if(iAiiAj),/if(iAiiAj)temp=iAi;iAi=iAj;iAj=temp;coutThebigNumberis:iA9endl;,多维数组,二维数组与多维数组:intiA510;intiB23=1,2,3,4,5,6;intiC246;多维数组的初始化仅有第一个维数可以省去intiB3=1,2,3,4,5,6,7,8,9;,数组练习程序mdim.cc,#includeusingnamespacestd;intmaximum(int4,int,int);intmain()intsg34=68,77,73,86,87,96,78,89,90,70,81,86;coutthemaxgradeismaximum(sg,3,4)endl;,intmaximum(intgrade4,introw,intcol)intmax=grade00;for(inti=0;imax)max=gradeij;returnmax;,结构1,将不同类型的相关数据信息组织在一起是用户自定义的类型需要先声明类型的定义才能使用结构与数组的区别数组只是同一个数据类型的聚集数组本身不是一个新的数据类型,结构2,struct;(结构变量名);structPersoncharname20;unsignedlongid;floatsalary;charaddress200;p1,p2;,结构的赋值1,通过取成员操作(.)来引用结构变量的元素Personp1=G.WBush,1000010,1.5,ZhongGuanChun,Beijing,China;strcpy(,G.WBush);p1.id=1000010;p1.salary=1.5;strcpy(p1.address,ZhongGuanChun,Beijing,China);,结构的赋值2,结构赋值的例子Personp1=G.WBush,1000010,1.5,ZhongGuanChun,Beijing,China;Personp2=p1;,结构的存储模式1,每一个成员都有自己的存储空间对每一个成员的操作都是独立的,各元素间不会相互影响,结构的存储模式2,#includeusingnamespacestd;structPersoncharname20;unsignedlongid;floatsalary;intmain()Personp1=ZhangWeilong,1000101,32;cout,Whatarepointersfor?,Accessingarrayelements.Passingargumentstoafunctionwhenthefunctionneedstomodifytheoriginalargument.Passingarraysandstringstofunctions.Obtainingmemoryfromthesystem.Creatingdatastructuressuchaslinkedlists.,Pointer,address,variable,inttheVariable=5;int*pPointer=,5,2000,2000,2001,2002,2003,2004,2005,2006,2007,2008,2009,2010,address,theVariable,pPointer,指针1,编译器为变量与常量分配存储空间任何存储空间都用地址来表示任何变量/常量都有地址一个变量的地址也是一个有意义的值变量地址也可进行运算这个值也可以用另一个变量来存储这另一个变量的类型就是指针类型,指针2,指针就是用来存储其他变量的地址的变量指针变量自己也有地址指针是有类型的指针的类型要跟它所指向的变量的类型一致整数指针,浮点数指针,理解指针的例子程序addr.cc,定义下面的变量,分别输出它们的值与他们的存储地址intiVal1=1;intiVal2=2;doubledVal1=1.1;doubledVal2=2.2;,指针的定义,*;int*ip;constint*icp;char*str;NULL指针,指针的操作,取地址操作符,指针的类型,整数型变量intiVal;iVal=10;整数指针性变量int*iPtr;iPtr=Anydatatypeinc+canbeapointertype.,指针的使用,指针在使用前必须初始化指针的类型决定了指针所参与的运算指针只能进行加减法运算,理解指针的例子程序ptracc.cc,#includeusingnamespacestd;intmain()intvar1=11;intvar2=22;int*ptr;ptr=,理解指针的例子程序ptracc.cc,Var1(11),Var2(22),Var1(11),Var2(22),*ptris11,*ptris22,ptr,ptr,指针与数组,数组的本质就是数组里所有变量的首地址数组的下标操作就是针对地址,指针与数组的例子程序ptr.cc,分别用数组的方式与指针的方式来操作intiv5分别给他们赋初值并输出他们的值与地址:#includeusingnamespacestd;intj;intiv5=1,2,3,4,5;intmain()inta=800;inti;intb=900;int*ptr=,指针与数组的例子程序ptr.cc,cout)操作来存取成员,结构数组,数组的元素是某一个结构类型structPersoncharname20;unsignedlongid;floatsalary;charaddress200;;PersonallPeople100;,结构中的数组元素,结构中的某个元素是数组类型structPersoncharname20;unsignedlongid;floatsalary;charaddress200;;PersonJack=Jack,2L,8000.00,Toronto;,指针作形参,利用指针在函数中传递参数,程序swap1.cc,#includeusingnamespacestd;voidswap(int,int);intmain()inta=3,b=8;couta=a,b=bendl;swap(a,b);coutafterswappingn;couta=a,b=bendl;voidswap(intx,inty)inttemp=x;x=y;y=temp;,程序swap2.cc,#includeusingnamespacestd;voidswap(int*,int*);intmain()inta=3,b=8;couta=a,b=bendl;swap(,练习程序date.cc,Thisisyourassignment要求用结构、指针。,Qip=newint;float*fp;fp=newfloat;int*ipA=newint5;int*pA5;for(intj=0;j5;j+)pAj=newint10;,Delete操作,deleteip;deletefp;deleteipA;for(intj=0;j5;j+)deletepAj;,含指针的结构变量的赋值,如果结构中含有指针成员,使用了动态空间,通过指针传递参数,函数的形参类型可以是指针通过指针来传递参数,练习程序ptrsort.cc,#includeusingnamespacestd;intmain()voidbsort(int*,int);constintN=10;intdataN=37,84,62,91,11,65,57,28,19,49;int*arr=newintN;for(inti=0;iN;i+)arri=datai;bsort(arr,N);for(intj=0;jN;j+)coutarrj;coutendl;deletearr;,练习程序ptrsort.cc,voidbsort(int*ptr,intn)voidorder(int*,int*);intj,k;for(intj=0;j*numb2)inttemp=*numb1;*numb1=*numb2;*numb2=temp;,危险的指针用法,使用NULL指针的内容使用没有初始化的指针变量使用已经被delete的指针内容函数返回局部变量的地址由函数申请的堆空间,而由调用者来释放,函数指针,调用一个函数函数都有地址,存放在内存的代码区(code).函数指针函数指针指向代码区中的某个函数。函数指针的声明int(*func)(chara,charb);int*func(chara,charb);/howaboutthisone?,函数指针,funcisapointerthatpointstoafunction.Example:intfn1(chara,charb);int*fn2(charx,chary);intfn3(inta);int(*fp1)(chara,charb);int(*fp2)(ints);fp1=fn1;/okfp1=fn2;/errorfp2=fn3;/okfp2=fp1;/errorfp1=fn2(a,b);/error.fp1(a,b);/ok,函数指针funcptr.cc,#includeusingnamespacestd;intswap(int*a,int*b)intt;t=*a;*a=*b;*b=t;intmain()inti=100;intj=200;intm=300;intn=400;couti=iendl;,函数指针funcptr.cc,coutj=jendl;swap(/endoffuncptr.cc,指针的指针,可以存在多层的指针intiNum;int*ptr;int*pptr;,void指针,void*ptr;,const与指针,普通指针:指向的对象的值可以改变,指针的值也可改变int*p;常量指针:指针可以指向不同的对象,但其指向的对象的值不能变constint*p;指针常量:指针本身是常量,只能指向固定的对象,但其指向的对象的值可改变int*constp;必须初始化常量指针指向常量constint*constp;必须初始化,引用,引用是一个变量的别名引用的声明intiVal;int引用的使用声明的时候就必须初始化引用不能重新赋值(不能重新绑定为另一个新对象的别名),引用的例子程序myRef.cc,#includeusingnamespacestd;intmain()intiVal=100;coutiVal=iValendl;coutage=yr;voidsetSalary(Person*pP,floats)pP-salary=s;voidsetAddress(Person*pP,char*addr)strcpy(pP-address,addr);,结构的操作2,voiddisp(Person*pP)coutnameageaddresssalaryendl;,使用结构变量的person.cc,#includeintmain()PersonJack=Jack,30,BeijingChina,8000.0;disp(,封装好的结构1,structPersoncharname30;unsignedintage;charaddress100;floatsalary;voidsetName(char*);voidsetAge(unsignedint);voidsetAddress(char*);voidsetSalary(float);voiddisp();,封装好的结构2,voidPerson:setName(char*str)strcpy(name,str);voidPerson:setAge(unsignedintyr)age=yr;voidPerson:setSalary(floats)salary=s;voidPerson:setAddress(char*addr)strcpy(address,addr);,封装好的结构3,voidPerson:disp()coutName:nameendl;coutAge:ageendl;coutAddress:addressendl;coutSalary:salaryendl;,使用封装后的结构变量的person.cc,#includeintmain()PersonJack=Jack,30,BeijingChina,8000.0;Jack.disp();Personsomebody;somebody.setName(Lisa);somebody.setAge(20);somebody.setAddress(Toronto,Canada);somebody.setSalary(6000.0);somebody.disp();,仍然存在的问题,#includeintmain()PersonJack=Jack,30,BeijingChina,8000.0;Jack.disp();Jack.salary=1000.00;Jack.disp();,如何实现数据隐藏,引入class类型对数据成员进行保护增加存取范围私有成员private保护成员protected公共成员public,定义类来实现数据隐藏,classPersonprivate:charname30;unsignedintage;charaddress100;floatsalary;public:voidsetName(char*str);voidsetAge(unsignedintyr);voidsetAddress(char*str);voidsetSalary(floatyuan);voiddisp();,类成员的作用域属性,在C+中,class与struct的区别struct的缺省作用域为publicclass的缺省作用域为privateprivate的数据成员只能被类的成员函数所使用,使用对象的person.cc,#includeintmain()Personsomebody;somebody.setName(Lisa);somebody.setAge(20);somebody.setAddress(Toronto,Canada);somebody.setSalary(6000.0);somebody.disp();,类的声明与类的定义,类的声明一般在头文件中声明类的所有成员声明类的成员的属性声明所有接口(公共函数成员)的签名(格式)类的定义一般放在程序文件(.cc文件)中定义类的所有成员函数的具体实现方法,对象,对象是类的一个实例Person是一个class,它是一个数据类型somebody是一个对象,它是一个具体的变量类是一类对象的描述定义结构,可以声明许多变量定义类,可以声明许多对象,增加对象初始化自己的能力,新person.cc程序的问题PersonJack=Jack,30,BeijingChina,8000.0;Jack.disp();构造函数一种特殊的函数没有返回类型只能作为是公共成员只能用一个固定的名字,函数名就是类的名字,Person类的构造函数,classPersonpublic:Person(char*,unsignedint,char*,float);,构造函数的特点,构造函数只在建立对象的时候自动被调用一次构造函数必须是公共的,否则无法生成对象构造函数只负责为自己的类构造对象,在构造函数中初始化变量,Person:Person():name(Jack),age(30),有构造函数的例子simpleClass.cc,#includeusingnamespacestd;classAinta;public:A()coutA()endl;A(constint,析构函数,与构造函数相对应与构造函数的作用相反析构函数的形式类名(),析构函数的特点,固定的函数名称类名()没有返回类型没有参数不可以重载一般由系统自动的调用,C+默认的构造函数,C+自动给每一个class加上一个构造函数这个构造函数没有任何参数这个构造函数也不做任何操作如果用户自己定义了一个构造函数,C+就不再提供默认的构造函数了,C+默认的析构函数,C+自动给每一个class加上一个析构函数析构函数不能有任何参数这个析构函数也不做任何操作如果用户自己定义了一个析构函数,C+就不再提供默认的析构函数了,构造函数的作用,提供内部成员变量的初始化功能完成对象的初始化内存管理实现对象的拷贝功能,构造函数的调用,classApublic:voiddisp();Aa,*b=newA,*c=newA(),*d=new(A);/aretheyallright?a=A();Aaa();/wontinstantiateanyobject.,构造对象的顺序,局部与静态局部对象,以声明的顺序构造静态对象只被构造一次全局对象在main之前构造全局对象的构造无特殊顺序数据成员对象,以声明顺序构造,析构函数的作用,与构造函数相反释放资源内存管理析构函数的调用什么时候析构函数被调用,析构函数的例子,#includeusingnamespacestd;classStrintlen;char*string;public:Str(char*=default);Str();Str:Str(char*s)string=newcharlen=strlen(s)+1;strcpy(string,s);,Str:Str()coutDestructorofstringendl;deletestring;intmain()Str*words=newStr3;deletewords;,析构函数的直接调用,析构函数可以被直接调用#includeintmain()Personp;p.Person();,对象指针,定义的类就是一个数据类型对象与对象指针new与delete对象指针的使用,This成员,thisthis的使用,对象的引用,对象也可以有别名,Person对象的指针与引用,person:person(constperson,面向对象的程序设计方法,自然界就是由许多的对象组成自然界中的任何一个实体都可以看作一个对象非实体也能看成某种对象(逻辑上的实体)自然界的现象就是许许多多的同类与不同类的对象在相互作用一个对象包含一个或多个其他的对象一个对象使用另一个或多个对象同种或不同种的对象之间存在各种复杂的关系,面向对象的程序设计方法,分析并分解出某个问题中的种种对象准确的描述所有对象之间的种种关系找到它们之间的所有相互作用用程序设计语言与工具来描述它们用程序开发语言来表达(实现)它们,对象的特点,对所有对象进行抽象总结名称属性行为用class来表述,传统的程序设计方法,程序数据算法算法函数控制流程传统方法的特点结构化封装,但无法隐藏算法依赖于数据,更改与维护困难重用性差,面向对象的方法,分析问题,找到对象抽象出对象的属性与特点划分出类确定类与类的关系用类来定义程序结构,面向对象的优点,更好的封装数据隐藏操作屏蔽把特定的数据与相应的操作组合在一起把可见的与不可见的部分很理想的分离开来C+语言中封装是由类来实现的,面向对象的优点,继承更好的可重用特性软件更易扩展与更可维护性,面向对象的优点,多态最重要的面向对象特性之一突出的优点,Exercises,设计一个叫做String的类,要求该类能够完成以下功能:(1)构造函数能够根据实际传入的参数分配实际存储空间;缺省时为100字节;(2)析构函数释放该空间;(3)编写成员函数Assign,可以将一个字符串赋值给该类;(4)编写成员函数Disp,可以将该类的内容打印到屏幕上;(5)编写成员函数Replace,用于替换某一指定的字符串;(6)编写成员函数Append,用于向已有的数据后面添加数据;(7)编写成员函数Size,用于得到当前数据的真实长度。编写测试程序,测试这个类。,classStringchar*str;unsignedintlen;public:String();String(constchar*sz);String();/Return0-success,-1ErrorintAssign(char*);voidDisp();/Return0-success,-1ErrorintReplace(char*from,char*to);/Return0-success,-1ErrorintAppend(char*);unsignedintSize();,Q;;,继承的例子,classPersonpublic:voiddisp();classStudent:publicPersonpublic:intgrade;voidsetGrade(int);,哪些东西可以继承,类成员的可见性publicprivateprotected派生方式影响可见性class派生类名:父类名,覆盖,覆盖将隐藏基类的方法classStudent:publicPersonpublic:intgrade;voidsetGrade(int);voiddisp();voidStudent:disp()coutdisp()ofStudent.endl;调用基类的方法Person:disp();,基类的内存模式,enumSexMALE,FEMALE;classPersonprivate:charname20;unsignedintage;protected:Sexgender;floatsalary;public:voidEat();voidDrink();voidSleep();voidDisp();,name,age,gender,Eat,Drink,Sleep,salary,Disp,派生类的内存模式1,classStudent:publicPersonprivate:intgrade;public:voidStudy();voiddisp();,派生类的内存模式2,在一个Student对象中,包含有一个Person对象那么,在Student对象中,有没有Person对象的私有数据成员存在?unsignedintagefloatsalary,类继承的程序例子mamal.cc,#includeenumBREEDGOLDEN,CAIRN,DANDIE,SHETLAND,DOBERMAN,LAB;classMammalpublic:/constructorsMammal();Mammal();/accessorsintGetAge()const;voidSetAge(int);intGetWeight()const;voidSetWeight();,/OthermethodsvoidSpeak()const;voidSleep()const;protected:intitsAge;intitsWeight;,类继承的程序例子mamal.cc,classDog:publicMammalpublic:/ConstructorsDog();Dog();/AccessorsBREEDGetBreed()const;voidSetBreed(BREED);/OthermethodsvoidWagTail();voidBegForFood();protected:BREEDitsBreed;,构造函数,构造函数的调用顺序由基类到派生类如何向基类的构造函数传递参数容易犯的错匹配构造函数,析构函数,析构函数的调用顺序由派生类到基类直接调用派生类的析构函数基类的析构函数是否也被调用?,哪些东西可以派生,任何一个类都可能派生出新的类原始数据类型无法派生classA:publicint;,Polymorphism,多态的本质C+允许把派生类对象赋给基类的指针所有的派生类在本质上都isa基类用基类的指针调用任何方法,C+都能找到相应的派生类的方法,Polymorphismexample:horse.cc,#includeusingnamespacestd;classHorsepub

温馨提示

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

评论

0/150

提交评论