C++整理笔记_第1页
C++整理笔记_第2页
C++整理笔记_第3页
C++整理笔记_第4页
C++整理笔记_第5页
已阅读5页,还剩83页未读 继续免费阅读

付费下载

下载本文档

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

文档简介

1C对C的扩展11类型增强111类型检查更严格C语言中可以把一个CONST指针赋给一个非CONST类型的指针。CONSTINTA100INTPP200不仅编译能通过,而且还可以修改值。上述那个例子C中编译就不能通过,除非是CONSTINTP因为C对类型更严格要求,分析A是CONSTINT型的,对A取地址,变成CONSTINT型的了。112新增布尔类型C语言中是真假或者用0和非0表示,C的逻辑有了具体的类型113枚举增强C语言中枚举的本质就是整型,可以用任意整型去复制,C中是真正的枚举,枚举里面有什么你只能从这里面选,而不能自己去赋值。114变量检测性增强例如C语言中多个同名的全局变量最终会被链接到全局数据区的同一个地址空间上INTG_VARINTG_VAR1而C拒绝这样二义性的做法。115其他1C中所有的变量和函数都必须有类型,C语言中的默认类型在C中是不合法的,函数F的返回值是什么类型,参数又是什么类型函数G可以接受多少个参数2比如三目运算符中,C语言中表达式的返回值是变量的值,不能作为左值,在C中表达式返回的是变量的本身。当左值的条件要有内存空间;C编译器帮助程序员取了一个地址而已。思考如何让C中的三目运算法当左值呢3C语言里面寄存器变量不能取地址,C中就可以。4在C语言中INTF;表示返回值为INT,接受任意参数的函数INTFVOID;表示返回值为INT的无参函数在C中,INTF和INTFVOID具有相同的意义,都表示返回值为INT的无参函数。5C有221032个关键字C有221011201073个关键字总结C语言的安全更是一种把安全交给程序员操作者,C就相对安全很多,例如C中STRING类就相对更高安全级别。12输入与输出及其格式121CIN与COUTCIN与COUT是C的标准输入流和输出流,他们在头文件IOSTREAM中定义。流名含义隐含设备流名含义隐含设备CIN标准输入键盘CERR标准错误输出屏幕COUT标准输出屏幕CLOGCERR的缓冲输出屏幕122格式化C中对于输出数据格式控制略复杂SETIOSFLAGSIOSLEFT,左对齐SETW5,设置域宽,SETPRECISION5,设置精度,保留多少有效数字,COUTUSINGNAMESPACESTDVOIDPRINTDOUBLEACOUTUSINGNAMESPACESTDINTMAININTAINTRETURN0142规则引用是一种声明关系,同类型之间的声明关系不同类型之间不能相互引用,只为同类型之间引用关系一旦产生,不可更改,声明不会产生空间开销,即引用不会产生空间开销一个变量可以有多个引用,多次引用的结果就是他们所有引用都指向同一块内存引用的本质是指针,引用取得了指针的优良特性,建立引用的指针没有意义引用必须初始化,不单独存在,必须跟一个实体在一起INCLUDEUSINGNAMESPACESTDINTMAININTA,BINTINT/错误,不可更改原有的引用关系FLOAT/错误,引用类型不匹配COUTUSINGNAMESPACESTDVOIDSWAPINTA,INTBINTTEMPAABBTEMPVOIDSWAPINTABBTEMPINTMAININTA3INTB5SWAPCOUTMOVL0X3,0XCEBP18INTB50X401662MOVL0X5,0X10EBP19SWAP0X401669LEA0X10EBP,EAX0X40166CMOVEAX,0X4ESP0X401670LEA0XCEBP,EAX0X401673MOVEAX,ESP0X401676CALL0X40160020COUTMOV0X10EBP,EBX0X40167EMOV0XCEBP,EAX0X401681MOVEAX,ESP0X401684MOV0X6FCBA2C0,ECX0X401689CALL0X4017940X40168ESUB0X4,ESP0X401691MOVL0X404064,0X4ESP0X401699MOVEAX,ESP0X40169CCALL0X40179C0X4016A1MOVEBX,ESP0X4016A4MOVEAX,ECX0X4016A6CALL0X4017940X4016ABSUB0X4,ESP0X4016AEMOVL0X4017A4,ESP0X4016B5MOVEAX,ECX0X4016B7CALL0X4017AC0X4016BCSUB0X4,ESP21SWAPA,B0X4016BFLEA0X10EBP,EAX0X4016C2MOVEAX,0X4ESP0X4016C6LEA0XCEBP,EAX0X4016C9MOVEAX,ESP0X4016CCCALL0X401622对比结果15NEW与DELETE151NEW常见几种INTQNEWINT200INTPANEWINT101,2CHARPARRAYNEWCHAR10NULLINTD2PA4NEWINT340/这里要打两个大括号,二维数组形式152DELETE用法153NEWSTRING类型INTMMNEWINTDELETEMMINTPMNEWINT10DELETEPMSTRINGS“HFIURGAS“STRINGPSNEWSTRING/CHARPPCHARPCHARPNULLPPPINTMMNEWINTDELETEMMINTPMNEWINT10DELETEPM/删除一个数组的PSS注意若变量中有涉及堆空间,NEW是先创建空间,然后构造带上CHARNAME里面的空间,DELETE是删除栈指向的那个空间,由于调用析构函数,才把CHARNAME的空间删除了。DELETE不是删除堆上的CHAR指向的空间,一定要记得。154关于返回值C申请内存失败会抛出一个异常。16内联函数C中提供了内联的关键字INLINE,实现真正的内嵌。161评价1宏函数,代码内嵌,避免了函数的压栈和出栈会带来语义上的误差,TEXT段会变大TEXT的空间,换取了运行的时间2函数高度抽象的一段逻辑,避免重复造轮子压栈与出栈会消耗换取了TEXT的空间。3INLINE不会有语义上的误差,而且避免了压栈与出栈但是过多使用INLINE会造成代码段的空间17类型转换C类型转换引入了四种转化形式171静态类型转换格式STATIC_CAST标识符多用于简单数据类型的转换,例如INTA10INTB3FLOATCSTATIC_CASTA/BCOUT标识符后面详细介绍173重新解释类型转换格式REINTERPRET_CAST标识符多用于类型的重新解释定义,但不会改变其原来的值。174脱常类型转换这个比较复杂格式CONST_CAST标识符1对于对普通常变量的引用或者指针的转换,原本的值都不会改变CONSTINTGG300INTRG333COUTPG444COUTVALRVDATA100COUTREINTERPRET_CASTARRAY1PRINTF“XN“,PAPVCONST_CASTPVDATA555COUTDATAS2COUTS2“VRWHILEFGETSBUF,1024,PNULLVRPUSH_BACKBUFFORINTI0ITYPEDEFSTRUCTCCCINTACHARBINTCSTRUCTBBBINTXINTYBBBCCCINTMAINVOIDCCCSPRINTF“DN“,SIZEOFS/20RETURN0212CLASSCLASS将数据和行为打包在一起,对外屏蔽数据,提供接口,对内共享数据,使用方法,CLASS默认属性是PRIVATE。类名其实相当于一个命名空间。INCLUDEINCLUDEUSINGNAMESPACESTDCLASSSTACKPUBLICSTACKINTSIZE10/参数列表效率高,但有赋值出现要考虑成员变量的顺序_SIZESIZE,SPACENEWCHARSIZE,TOP0MEMSETSPACE,0,SIZESTACKDELETESPACESTACKCONSTSTACKMEMCPYSPACE,ANOTHERSPACE,ANOTHER_SIZE_SIZEANOTHER_SIZETOPANOTHERTOP/STACKCONSTSTACK/_SIZEANOTHER_SIZE/TOPANOTHERTOP/VOIDPUSHCHARCHSPACETOPCHCHARPOPRETURNSPACETOPBOOLISFULLRETURNTOP1024BOOLISEMPTYRETURNTOP0VOIDCLEARTOP0PRIVATECHARSPACEINTTOPINT_SIZEINTMAINSTACKSSPUSHASPUSHBSPUSHC/STACKSCSWHILESCISEMPTYCOUTUSINGNAMESPACESTDCLASSSTUDENTPUBLICSTUDENTSTRINGSNNAMESN,LENSNSIZE/这里时刻要注意参数要根据成员变量的顺序来决定初始化的内容是不是正确的VOIDDISCOUTUSINGNAMESPACESTDCLASSSTUDENTPUBLICSTUDENTSTRINGSNNAMESN,LENSNSIZE/这里要注意传入的是成员变量的顺序,所以先有长度,所以LEN里面不能写NAME的长,只能写传入的字符串的长度去初始化,否则出错VOIDDISCOUT_STRLENSTRLENSTR_STRPSNEWMYSTRINGLEN1/要清楚是什么分配了空间STRCPYPS_STR,THIS_STR/注意拷贝到的是一个PS的_STR中而不是PS中STRCATPS_STR,STR_STRRETURNPSBOOLMYSTRINGOPERATOR_STR,STR_STRCONSTMYSTRINGELSERETURNFALSEBOOLMYSTRINGOPERATORCONSTMYSTRINGELSERETURNFALSE38栈和堆上的对象及对象数组的构造问题首先这个问题是为了成功初始化生成的数组,那么一定必调用无参构造器。那么就必须有无参构造函数,自己写的也要包含。INCLUDEUSINGNAMESPACESTDCLASSSTUPUBLICSTUSTRINGN_NAMENVOIDDISCOUTUSINGNAMESPACESTDCLASSFUNPUBLICFUNINTI,INTJVALIALJVOIDFUNCCONST/AL100这里是不行的,承诺不修改数据COUTAL50PRIVATECONSTINTVALINTALINTMAINCONSTFUNS3,4/CONST对象只调用CONST函数,不能修改内部数据成员FUNP1,2/非COSNT修饰对象优先调用非CONST成员函数,若没有才调用CONST的同名重载SFUNCPFUNCRETURN0311STATIC修饰符在C中,静态成员变量其实起到让修饰的变成公共资源的作用,所有对象都可以共享它,数据可以共享而又不会被隐藏,最好不用全局变量,保证数据的安全性还可以节省内存。与C语言中的不可同日而语了。类的静态成员,属于类,也属于对象,但终归属于类3111静态数据成员的声明以及初始化静态数据成员定义在类的内部,初始化一定要在类的外部。修饰成员变量,不占用空间,在DATA的RW段1声明STATIC数据类型成员变量2初始化数据类型类名静态成员数据初值3112静态成员函数1静态成员函数成员函数前加STATIC提供接口访问静态成员变量管理静态成员,也是方便了类本身。2对比来说普通成员函数只能通过对象调用3静态成员函数不能调用非静态的成员函数,因为不含THIS指针,不知道哪个对象调。4非静态成员函数可以调用静态成员函数。INCLUDEUSINGNAMESPACESTDCLASSSCHOOLPUBLICSTATICVOIDADDLIBSTRINGNEWLIB/静态成员函数没有THIS指针LIBNEWLIB/TOWERNEWLIB错误用法,因为TOWER不是静态的成员变量不能调用STATICVOIDSHOWLIBCOUTTOWERINCLUDEUSINGNAMESPACESTDCLASSSTUDENTPUBLICSTUDENTSTRINGNNAMENIFHEADNULLHEADTHISTHISNEXTNULLELSETHISNEXTHEADHEADTHISSTATICVOIDPRINTSTUDENTLISTSTATICVOIDDELETESTUDENTLISTPRIVATESTRINGNAMESTUDENTNEXTSTATICSTUDENTHEADVOIDSTUDENTPRINTSTUDENTLISTSTUDENTPHEADWHILEPNULLCOUTNAMENEXTVOIDSTUDENTDELETESTUDENTLISTSTUDENTPHEADWHILEHEADHEADHEADNEXTDELETEPPHEADSTUDENTSTUDENTHEADNULLINTMAINSTRINGNAMESTRINGPOSTNAMECHARBUF1024FORINTI0ICLASSSTUDENTPUBLICSTUDENTSTRINGN,INTNUNAMEN,NUMNUSTRINGNAMEINTNUMINTMAINSTUDENTS“ZHANGSAN“,1002STUDENTS2“LISI“,1001/STRINGPS/COUTPSUSINGNAMESPACESTDVOIDFUNCINTACOUTUSINGNAMESPACESTDCLASSAPUBLICSTATICVOIDDISSTATICINTDATAVOIDADISCOUTUSINGNAMESPACESTDCLASSWIDGETPUBLICWIDGETFPTR0FPTR1FPTR2FPTR3VOIDSELECTINTIDX,INTVALIFIDXCNTRETURNTHISFPTRIDXVALINTCOUNTRETURNCNTPRIVATEVOIDFINTVALCOUTCLASSSTACKPUBLICSTACKINTLEN10/形参初始化列表STACKSTACKCONSTSTACKSTACK/重载等号操作符VOIDPUSHINTDATACHARPOPVOIDCLEARBOOLISEMPTYBOOLISFULLPRIVATECHARSPACE/栈空间的大小,这里最好为指针INTTOP/位置INT_SIZE/拷贝构造时用的统计大小ENDIFSTACKCPPINCLUDE“STACKH“INCLUDEINCLUDEUSINGNAMESPACESTDSTACKSTACKINTLEN_SIZELEN,SPACENEWCHARLEN,TOP0/这里INTLEN一定要记得加上MEMSETSPACE,0,LEN/把栈空间初始化,是传入的大小VOIDSTACKPUSHINTDATA/压栈操作SPACETOPDATACHARSTACKPOP/出栈操作并返回值RETURNSPACETOPVOIDSTACKCLEAR/清空整个栈TOP0BOOLSTACKISEMPTY/判断是否为空RETURNTOP0BOOLSTACKISFULL/判断是否为满RETURNTOP1024STACKSTACKCONSTSTACK/还是要申请空间,注如果程序中没有成员变量需要申请堆上空间否则可以不用释放MEMCPYTHISSPACE,OTHERSPACE,OTHER_SIZETHIS_SIZEOTHER_SIZETHISTOPOTHERTOPSTACKMEMCPYTHISSPACE,ANOTHERSPACE,ANOTHER_SIZETHIS_SIZEANOTHER_SIZETHISTOPANOTHERTOPSTACKSTACKDELETESPACECOUTINCLUDEINCLUDE“STACKH“USINGNAMESPACESTDINTMAINSTACKSSPUSHASPUSHBSPUSHCSPUSHDSPUSHESPUSHFSPUSHGSTACKSSSSTACKST/STACKSTS这里不是重载等号,跟程序中的情况不一样STSWHILESSISEMPTYCOUTINCLUDEUSINGNAMESPACESTD/这个跟前面一行一定要记得加上去,不然COUT等等用不了LISTLISTHEADNEWNODE/HEAD是在类中成员变量存在的,不用NODEHEADHEADNEXTNULLVOIDLISTINSERTLISTINTDATA/插入节点NODECURNEWNODECURDATADATACURNEXTHEADNEXTHEADNEXTCURNODELISTSEARCHLISTINTDATA/查找链表,为了删除传入节点用,返回一个节点,没有返回空NODEPSHEADNEXTWHILEPSNULLIFPSDATADATARETURNPSPSPSNEXTRETURNNULLVOIDLISTDELETELISTNODEPFIND/删除节点,记得释放NODEPSHEADNEXT/这里是作为标记,而不是创建一个新的节点,所以不要跟前面一样NEW一个WHILEPSNEXTPFINDPSPSNEXTPSNEXTPFINDNEXTDELETEPFIND/记得要释放这个要删除的节点VOIDLISTDESTROYLIST/清空链表NODEPHHEADWHILEHEADNULLDELETEPHPHHEADNEXTVOIDLISTTRAVERSELIST/遍历链表NODEPHHEADNEXT/这里是作为标记,而不是创建一个新的节点,所以不要跟前面一样NEW一个WHILEPHNULLCOUTDATANEXTMAIN,CPPINCLUDEINCLUDE“LISTH“USINGNAMESPACESTDINTMAINLISTLSINTI0FORI0IUSINGNAMESPACESTDCLASSMYSTRINGPUBLICMYSTRINGCONSTCHARSNNULL/这里一定要包含无参数的情况,用默认参数实现MYSTRINGCONSTMYSTRINGMYSTRINGMYSTRINGOPERATORCONSTMYSTRINGBOOLOPERATORCONSTMYSTRINGBOOLOPERATORCONSTMYSTRINGFRIENDISTREAM/命名空间要写上,否则ISTREAMOSTREAM用不了FRIENDOSTREAMMYSTRINGMYSTRINGCONSTCHARSN/这里传入是个另一个拷贝的,传入的可以是一个NULL的指针,并不是类的对象用IFSNNULL_STRNEWCHAR1_STR0/如果没有上面分配空间,那么不能置为NULL,可以这样“,因为是自己的CHARELSEINTLENSTRLENSN_STRNEWCHARLEN1STRCPY_STR,SNCHARMYSTRINGC_STRRETURN_STRMYSTRINGMYSTRINGCONSTMYSTRINGTHIS_STRNEWCHARLEN1STRCPY_STR,STR_STRMYSTRINGDELETETHIS_STRINTLENSTRLENSTR_STRTHIS_STRNEWCHARLEN1STRCPYTHIS_STR,STR_STRRETURNTHISMYSTRINGMYSTRINGOPERATORCONSTMYSTRINGINTLENSTRLENTHIS_STRLENSTRLENSTR_STRPSNEWMYSTRINGLEN1/要清楚是什么分配了空间STRCPYPS_STR,THIS_STR/注意拷贝到的是一个PS的_STR中而不是PS中STRCATPS_STR,STR_STRRETURNPSBOOLMYSTRINGOPERATOR_STR,STR_STRCONSTMYSTRINGELSERETURNFALSEBOOLMYSTRINGOPERATORCONSTMYSTRINGELSERETURNFALSEISTREAMRETURNINOSTREAMINTMAINMYSTRINGS“FAIRLEEHU“MYSTRINGS1SMYSTRINGS3MYSTRINGS2S3S2S1MYSTRINGS4S4S1S2MYSTRINGS5“CAAA“MYSTRINGS6“BBBB“IFS5S6COUTS7COUTGROWUPGROWUPGROWUPGROWUPGROWUP同时时刻注意在C编程中输出的对象要是一个地址。21MYSTRINGCONSTCHARSNNULLMYSTRINGMYSTRINGCONSTCHARSN/这里传入是个另一个拷贝的,传入的可以是一个NULL的指针,并不是类的对象用,不用改变原来的串IFSNNULL_STRNEWCHAR1_STR0/如果没有上面分配空间,那么不能置为NULL,可以这样“,因为是自己的CHARELSEINTLENSTRLENSN_STRNEWCHARLEN1STRCPY_STR,SN2PUBLICSTUCHARNAME“,INTAGE0/这里用”,是因为传入的字符串直接给NAMENAMENAME,AGEAGE了,若为NULL那么就给对象赋了野指针,就错了。这里改变了传入的串,为我所用了。VOIDPRINTCOUTNAMEAGELIBINCLUDEUSINGNAMESPACESTDCLASSA1CLASSPOINTERPUBLICINTGETDISTANCECONSTA2CLASSAPUBLICAINTX,INTY_XX,_YYFRIENDINTPOINTERGETDISTANCECONSTAPRIVATEINT_XINT_YINTPOINTERGETDISTANCECONSTAINTYA1_XA2_YRETURNSQRTXXYYINTMAINAS5,6AP4,7POINTERPPINTVALPPGETDISTANCES,PCOUTUSINGNAMESPACESTDCLASSCOMPLEXPUBLICCOMPLEXFLOATX0,FLOATY0_XX,_YYVOIDDISCOUT_XANOTHER_X,THIS_YANOTHER_YINTMAINCOMPLEXC12,3COMPLEXC23,4C1DISC2DIS/COMPLEXC3C1C2/COMPLEXC3OPERATORC1,C2COMPLEXC3C1C2/优先调用成员函数重载C3DISRETURN052重载运算符的两种形式1通过全局函数来重载注意流输入和流输出是不能通过成员函数重载的2通过形成成员函数来重载只能通过成员函数去重载的,53运算符重载举例重载前置加加AINCLUDEUSINGNAMESPACESTDCLASSAPUBLICAINTX0,INTY0_XX,_YYA/这里是前置加加/CONSTA/亚元,这里是后置加加,要考虑到基础数据类型能不能编译通过A这样通不过VOIDDISPLAYCOUT_XTHIS_YRETURNTHIS/CONSTA/THIS_X/THIS_Y/RETURNT/INTMAINAA1,3ABABAADISPLAY/结果为35BDISPLAY结果为35RETURN0重载后置加加INCLUDEUSINGNAMESPACESTDCLASSAPUBLICAINTX0,INTY0_XX,_YY/A/这里是前置加加CONSTA/亚元,这里是后置加加,要考虑到基础数据类型能不能编译通过A这样通不过VOIDDISPLAYCOUT_X/THIS_Y/RETURNTHIS/CONSTATHIS_XTHIS_YRETURNTINTMAINAA1,3ABABAADISPLAY结果为35BDISPLAY结果为24RETURN0重载流输入流输出操作符ISTREAMOSTREAMCLASSPRINT3DCLASSPRINT2DPUBLICPRINT2DINTX0,INTY0_XX,_YYVOIDDISPLAYCOUT_XP2_X/THIS_YP2_Y/THIS_Z0/PRIVATEINT_XINT_YINT_ZPRINT2DOPERATORPRINT3DRETURNPRINT3D_X,_Y,0INTMAINPRINT2DP21,2PRINT3DP3P3P2P3DISPLAYRETURN0554EXPLICIT关键字加上关键字,使用时以显示的方式完成转化STATIC_CAST源类对象。否则会报错。EXPLICITPOINT3DPOINT2DTHIS_YP_YTHIS_Z0如POINT2DP21,2P2DISPOINT3DP3ASTATIC_CASTP2P3ADIS56函数符号重载仿函数(函数操作符)广泛用于STL,作为入参。INCLUDEINCLUDEUSINGNAMESPACESTDCLASSSQRPUBLICINTOPERATORINTIRETURNIIDOUBLEOPERATORDOUBLEDRETURNDDINTMAINSQRSQRINTISQR4/SQROPREATOR4DOUBLEDSQR55/SQROPERATOR55COUTVOIDFOOAUTO_PTRPNEWAPFUNCPFUNC自己去实现INCLUDEUSINGNAMESPACESTDCLASSAPUBLICACOUTRETURN_PAPRIVATEA_PINTMAINSPSNEWASDISSDISRETURN06继承与派生61继承的定义继承就是新的类从已有的类那里获得包含的信息,继承与派生是不同的对象的称谓。继承方式规定了如何访问基类继承的成员。继承方式有PUBLIC,PRIVATE,PROTECTED。继承方式指定了派生类成员以及类外对象对于从基类继承来的成员的访问权限。公有继承基类的公有成员和保护成员在派生类中保持原有访问属性,其私有成员仍为基类的私有成员。私有继承基类的公有成员和保护成员在派生类中成了私有成员,其私有成员仍为基类的私有成员。保护继承基类的公有成员和保护成员在派生类中成了保护成员,其私有成员仍为基类的私有成员。PRETECTED对于外界访问属性来说,等同于私有,但可以派生类中可见。62继承的注意要点继承方式影响基类在子类的访问方式派生类中的成员,包含两大部分,一类是从基类继承过来的,一类是自己增加的成员。从基类继承过过来的表现其共性,而新增的成员体现了其个性。除了构造器和析构器之外,其它的全部都继承过来。但是基类可能造成派生类的冗余,所以基类需要设计63派生类的构造首先派生类的构造函数的初始化,是用初始化列表初始化的,并且只用它所继承的父类初始化,加上自己的参数初始化,并不是与父类的父类有关系。构造函数的初始化顺序,调用的时候按照继承的关系从前往后若派生类中含有内嵌子对象,那么其继承的基类参数初始化后,内嵌子类初始化,然后才是派生类。代码举例STUDENTSTUDENTSTRINGNA,CHARSE,INTNUNAMENA,SEXSE,NUMNUGRADUATEGRADUATESTRINGNA,CHARSE,INTNU,FLOATPRISTUDENTNA,SE,NUPRICEPRIDOCTORDOCTORSTRINGNA,CHARSE,INTNU,FLOATPRI,STRINGTIT,INTY,INTM,INTDGRADUATENA,SE,NU,PRI,BIRTHY,M,DTITLETIT子类构造器当中,是不是一定要指名父类的构造器呢。不一定。只要父类中有无参构造器,在子类构造器中就可以不用显示的调用,否则,编译不过。如果子类未显示实始化,则父类需要无参构造函数。如INCLUDEUSINGNAMESPACESTDCLASSFATHERPUBLIC/FATHERFATHERINTICLASSAPUBLIC/AAINTI0CLASSSONPUBLICFATHERPUBLICSONFATHER3,A100/若这里没有显示调用,即无参,则FATHER类中的构造PRIVATE必须含有无参,默认参数,或者重载,或者父AA类,子类全部都有参调用/FATHERASONINTMAINSONSRETURN064派生类的拷贝构造首先派生类的拷贝构造,是通过参数初始化列表来实现的,这里涉及到一个点,就是赋值兼容,派生类对象可以赋给基类来实现拷贝。派生类的拷贝构造的顺序跟构造的顺序一样,若含有内嵌子对象,也是先基类的拷贝,然后子对象的拷贝,最后派生类的拷贝。如STUDENTSTUDENTCONSTSTUDENTTHISNUMOTHERNUMTHISSEXOTHERSEXGRADUATEGRADUATECONSTGRADUATETHISMONTHBIRMONTHTHISYEARBIRYEARDOCTORDOCTORCONSTDOCTORSTUDENTTHISNUMOTHERNUMTHISSEXOTHERSEX子类GRADUATEGRADUATESTUDENTOPERATOROTHER/注意这里要指明父类的作用域,否则就形成了一个THISPRICEOTHERPRICE循环递归,就错误了,这里RETURNTHIS涉及到隐藏SHADOW67派生的作用域限定符以及SHADOW问题SHADOW,就是父类和子类函数名相同就行,不管你父类是有参,子类去调用有参都得通过对被隐藏的函数等需要去解决。INCLUDEUSINGNAMESPACESTDCLASSBASEPUBLICVOIDFUNCINTCOUTUSINGNAMESPACESTDCLASSSHAPEPUBLICSHAPEINTX,INTY_XX,_YYVOIDDRAWCOUTDRAWRETURN073多态形成的条件及虚函数父类中有虚函数。子类OVERRIDE覆写父类中的虚函数。要求函数名,返值类型,函数参数个数及类型全部匹配。并根据派生类的需要重新定义函数体。通过己被子类对象赋值的父类指针,或者引用也可以,但是指针比较常见,调用共用接口。CLASSSHAPEPUBLICSHAPEINTX,INTY_XX,_YYVIRTUALVOIDDRAWCOUTDRAWRETURN0总结虚继承解决的是父类数据的冗余的问题虚函数解决的是多态问题74纯虚函数741格式CLASS类名VIRTUAL函数声明0742总结1含有纯虚函数的类,称为抽象基类,不可实列化。即不能创建对象,存在的意义就是被继承,提供族类的公共接口,JAVA中称为INTERFACE。2纯虚函数只有声明,没有实现,被“初始化”为0。3如果一个类中声明了纯虚函数,而在派生类中没有对该函数定义,则该虚函数在派生类中仍然为纯虚函数,派生类仍然为纯虚基类。743虚函数代码例题分析INCLUDEUSINGNAMESPACESTDCLASSSHAPEPUBLICSHAPEINTX,INTY_XX,_YYVIRTUALVOIDDRAWINTI100COUTDRAW3/这里虽然调用是子类的DRAW函数,但是默认参数的值还是父类中的参数的值,可以理解父类声明,子类只是去实现。/注意的是子类要是为INTI那么这就不是多态了,所以只是简单的调用子类的函数,I值当然是子类中的值RETURN075虚析构1由栈对象转换为堆对象父类中定义为虚的析构2析构函数会调用子类的析构函数实现完全的析构ANIMALPNEWDOGPVOICEDELETEP3只有当这种多态形式存在,那么这种虚析构才有意义,含有虚函数就需要这种虚析构76注意只有类的成员函数才能声明为虚函数。虚函数仅适用于有继承关系的类对象,所以普通函数不能声明为虚函数。静态成员函数不能是虚函数静态成员函数不受对象的捆绑,只有类的信息。内联函数不能是虚函数构造函数不能是虚函数构造时,对象的创建尚未完成。构造完成后,才能算一个名符其实的对象。析构函数可以是虚函数且通常声明为虚函数77常见虚函数例题分析INCLUDEUSINGNAMESPACESTDCLASSAPUBLICAA100VIRTUALVOIDFUNC0INTACLASSBVIRTUALPUBLICAPUBLICVOIDFUNCCOUTUSINGNAMESPACESTD/声明STATICVIRTUALFRIENDINLINE/定义CONSTCLASSAPUBLICATHISFUNCVIRTUALVOIDFUNCCOUT。其中TYPE_INFO重载了操作符,分别用来比较是否相等、不等、赋值。函数NAME返回类型名称。常用于返回检测调试之用。INCLUDEINCLUDEUSINGNAMESPACESTDTYPEDEFVOIDFUNCCLASSBASEPUBLICVIRTUALBASECLASSDERIVEPUBLICBASEINTMAINCOUTUSINGNAMESPACESTDCLASSAPUBLICVIRTUALVOIDFUNCCLASSBPUBLICACLASSCPUBLICACLASSDPUBLICB,PUBLICCINTMAINBBAPACOUTPACPCSTATIC_CASTPA/DPDSTATIC_CASTPA/编译不通过的BPBBDYNAMIC_CASTPA/返回正确的地址COUTPA/值为0COUTPA/编译可以通过RETURN01确保基类定义了至少一个虚函数2不要将TYPEID作用于指针,应该作用于引用3TYPEID是一个运算符,而不是函数4TYPEID运算符返回的TYPE_INFO类型,其拷贝构造函数和赋值运算函数都声明为PRIVATE了,这意味着其不能用于STL容易,所以我们一般不能不直接保存TYPE_INFO信息,而保存TYPE_INFO的NAME信息79虚函数表C的多态是通过一张虚函数表(VIRTUALTABLE)来实现的,简称为VTABLE。在这个表中,主是要一个类的虚函数的地址表,这张表解决了继承、覆写的问题,保证其真实反应实际的函数。这样,在有虚函数的类的实例中这个表被分配在了这个实例的内存中,所以,当我们用父类的指针来操作一个子类的时候,这张虚函数表就显得由为重要了,它就像一个地图一样,指明了实际所应该调用的函数。INCLUDEUSINGNAMESPACESTDCLASSBASEPUBLICVIRTUALVOIDFCOUTINCLUDEUSINGNAMESPACESTDCLASSEMPLOYEEPUBLICEMPLOYEEVIRTUALVOIDGETPAY0VIRTUALVOIDGETLEVEL0VOIDDISINFOPROTECTEDSTRINGNAMEINTNUMINTLEVELFLOATSALARYSTATICINTSTARTNUMENDIF/EMPLOYEE_HINCLUDE“EMPLOYEEH“INTEMPLOYEESTARTNUM1000EMPLOYEEEMPLOYEEVOIDEMPLOYEEDISINFOCOUTINCLUDE“EMPLOYEEH“USINGNAMESPACESTDCLASSTECHNICIANPUBLICEMPLOYEEPUBLICTECHNICIANVIRTUALVOIDGETPAYVIRTUALVOIDGETLEVELSTATICTECHNICIANCREATEVOIDINITPRIVATEINTTIMEFLOATPOUNDFORTIMEENDIF/TECHNICIAN_HINCLUDE“TECHNICIANH“TECHNICIANTECHNICIANVOIDTECHNICIANGETPAYSALARYTIMEPOUNDFORTIMEVOIDTECHNICIANGETLEVELLEVEL3TECHNICIANTECHNICIANCREATETECHNICIANSNEWTECHNICIANSINITRETURNSVOIDTECHNICIANINITCOUTNAMENUMSTARTNUMLEVEL1COUTTIMEPOUNDFORTIME100MANAGERIFNDEFMANAGER_HDEFINEMANAGER_HINCLUDEINCLUDEINCLUDE“EMPLOYEEH“USINGNAMESPACESTDCLASSMANAGERVIRTUALPUBLICEMPLOYEEPUBLICMANAGERVIRTUALVOIDGETPAYVIRTUALVOIDGETLEVELSTATICMANAGERCREATEVOIDINITPROTECTEDFLOATBASEPOUNDENDIF/MANAGER_HINCLUDE“MANAGERH“MANAGERMANAGERVOIDMANAGERGETPAYSALARYBASEPOUNDVOIDMANAGERGETLEVELLEVEL4MANAGERMANAGERCREATEMANAGERMNEWMANAGERMINITRETURNMVOIDMANAGERINITCOUTNAMENUMSTARTNUMLEVEL1BASEPOUND8000SALESMANIFNDEFSALESMAN_HDEFINESALESMAN_HINCLUDEINCLUDEINCLUDE“EMPLOYEEH“USINGNAMESPACESTDCLASSSALESMANVIRTUALPUBLICEMPLOYEEPUBLICSALESMANVIRTUALVOIDGETPAYVIRTUALVOIDGETLEVELSTATICSALESMANCREATEVOIDINITPROTECTEDFLOATRATEFLOATSELLAMOUNTENDIF/SALESMAN_HINCLUDE“SALESMANH“SALESMANSALESMANVOIDSALESMANGETPAYSALARYRATESELLAMOUNTVOIDSALESMANGETLEVELLEVEL3SALESMANSALESMANCREATESALESMANSNEWSALESMANSINITRETURNSVOIDSALESMANINITCOUTNAMENUMSTARTNUMLEVEL1COUTRATECOUTSELLAMOUNTSALEMANAGERIFNDEFSALEMANAGER_HDEFINESALEMANAGER_HINCLUDEINCLUDEINCLUDE“EMPLOYEEH“INCLUDE“SALESMANH“INCLUDE“MANAGERH“CLASSSALEMANAGERPUBLICSALESMAN,PUBLICMANAGERPUBLICSALEMANAGERVIRTUALVOIDGETPAYVIRTUALVOIDGETLEVELSTATICSALEMANAGERCREATEVOIDINITENDIF/SALEMANAGER_HINCLUDE“SALEMANAGERH“SALEMANAGERSALEMANAGERVOIDSALEMANAGERGETPAYSALARYBASEPOUNDRATESELLAMOUNTVOIDSALEMANAGERGETLEVELLEVEL1SALEMANAGERSALEMANAGERCREATESALEMANAGERPNEWSALEMANAGERPINITRETU

温馨提示

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

评论

0/150

提交评论