资源预览内容
第1页 / 共143页
第2页 / 共143页
第3页 / 共143页
第4页 / 共143页
第5页 / 共143页
第6页 / 共143页
第7页 / 共143页
第8页 / 共143页
第9页 / 共143页
第10页 / 共143页
亲,该文档总共143页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
梦想是成长的潜力。C+学习笔记2类与数据抽象2运算符重载9继承16文件处理22异常处理24数据结构26链表26堆栈31队列32二叉树32模板100虚函数和多态性259string类与字符串处理393STL649I/O流1035C+杂记1136C+中const总结1240C+中的static成员1325构造函数与析构函数1367名字空间1452常用C+标准库头文件1539面向对象编程工程的一般结构1678出错提示1692this指针1703动态内存分配与new和delete运算符1754对象与成员关系的深入思考1775类、类成员、对象可借用二维表来描述:我的黄金思想1788类型转换1802函数指针1813关于友元1837C语言学习笔记1908C语言概述1909基本数据类型1970算术运算符2120程序结构2271C/C+数组2381C/C+指针2518C/C+函数2747结构型2924编译预处理3098条件编译3155C杂记3205运算符的优先级和结合律3224本文档结构:标题1标题3标题4本文档大部分内容取自C+大学教程(第二版),美Harvey M.Deitel和Paul James Deitel著,电子工业出版社。C+学习笔记类与数据抽象在C语言和其他过程化编程语言中,编程是面向操作的。而在C+中,编程是面向对象的。在C语言中,编程单位是函数,C语言程序员的主要工作是编写函数,完成某个任务的一组操作构成函数,函数的组合则构成程序。数据在C语言中当然很重要,但这些数据只用于支持函数所要进行的操作。系统指定中的动词帮助C语言程序员确定一组用于实现系统的函数。而在C+中,编程的单位是类,对象最终要通过类实例化。C+程序员把重点放在生成称为类的用户自定义类型。每个类包含数据和操作数据的一组函数。类的数据部分称为数据成员,类的函数部分称为成员函数,有些面向对象语言也称方法。int等内部类型的实例称为变量(variable),而用户自定义类型(即类)的实例则称为对象(object)。在C+中,变量与对象常常互换使用,C+的重点是类而不是函数。系统指定中的名词帮助C+程序员确定实现系统所需的用来生成对象的一组类。类与结构型:C+中的类是由C语言中的struct演变而来的,C+中的结构和类是非常相似的。结构成员可以是任何类型,但不能是结构本身的类型。例如,Time类型的成员不能在Time的结构定义中声明,但可以在该结构定义中声明Time结构的指针。当结构包含同一类型结构的指针时,称为自引用结构。自引用结构用于形成链接数据结构,如链表、队列、堆栈和树等。结构的定义并不在内存中保留任何空间,而是生成新的数据类型,用于声明变量。访问结构成员或类成员时,使用成员访问运算符,包括圆点(.)和箭头运算符(-)。圆点运算符通过对象的变量名或对象的引用(引用对象)访问结构和类成员。箭头运算符通过对象指针(指针对象)访问结构和类成员。结构与类相比生成的数据类型有一定的缺点。程序能够直接访问数据成员,所以无效的数据可能赋给结构成员。如果struct的实现方法改变,则所有使用这个struct的程序都要改变,这是因为程序员直接操作数据类型,没有一个“接口”保证程序员正确使用数据类型并保持数据的一致状态。有关结构型的更多信息参见“结构型”。结构与类是很相似的以下引用摘自网络:“结构和类在C+中有好多相似之处,同样可以有方法(在C中的结构就不行),同样都是数据类型,所说的不同也许是指C中的结构与C+中的类相比吧。”“其实在C+中,类和结构没有什么大的区别,也可以定义方法,只是在类中,默认的是private,而在结构中默认的是public。”结构也可以定义方法: class myc int in; float fl; ; struct mys int in; float fl; ; MyClass mc; MyStruct ms; int c=sizeof(mc); int s=sizeof(ms); 运行后c=s+4个字节,你用VC试试就知道了 原因:对于类(其实是浪废)多了一个虚函数指针,当上级类中有虚函数定义时,如果本类定义了这个虚函数,则执行 Up* u;Child* c=new Child(); u=c; /基类指针指向派生类对象 u.fun();/fun为u中定义的虚函数 第三行执行的是c定义的虚函数,运行时如何知道这一点呢,就是通过上面的指针现查到的 (即C+的多态性)。 总之:struct更节约内存,但不能定义虚函数了。总结:C+中的结构(struct)与类大致上相同。也就是说,结构中也可以定义函数,但不像类中定义的函数那样都有一个隐藏的this指针。另外,结构中的静态变量,对成员的引用方式,都与类相同。结构同样可以使用访问权限限定符来限定成员的访问属性,只是在默认情况下结构的成员访问属性为public,而类成员默认为private。成员函数响应对象接收的消息(message)。所谓消息是指函数对对象的调用(也说对象调用函数),这样的一种调用就是消息,而响应是指成员函数的执行。引自教材“消息对应于一个对象发给另一个对象或由函数发给对象的成员函数调用”。注意,类的public成员函数往往又称public服务、public行为、类的接口等,类的客户使用这些函数操作该类的数据。类的客户是指像main函数这样使用类提供的功能的对象。当不显示声明类的成员访问方式的时候,默认为private方式访问,但提倡显式声明。类定义包含类的数据成员和成员函数的声明。类的数据成员无法在类体中声明时初始化,而要用类的构造函数初始化,也可以用给它们设值的成员函数赋值;成员函数的声明就是声明函数原型,成员函数可以在类的内部定义,但在类的外部定义函数是个良好的习惯。类定义外定义成员函数需要加上二元作用域运算符与类名联系起来,惟一标识某个类的成员函数。尽管类定义中声明的成员函数可以在类定义之外定义,但成员函数的定义仍然在(属)类范围(classs scope,在类外定义的成员函数定义体也称类范围)。在类范围中,类成员可由该类的所有成员函数直接访问;在类范围外,类成员是通过一个对象的句柄引用,可以是对象名、对象引用(引用对象)或对象指针(指针对象)。每次引用对象中的数据成员和成员函数时,编译器自动插入一个隐式句柄,这个隐式句柄即this指针。看下面代码:class Basepublic:Base(int x) value = x;int getData() const ;private:int value;Base:getData() constreturn value;/在类体外定义的成员函数定义体也属于类范围,在类范围中直接访问类成员value.void main(void)Base b(59);coutb.getData();/在类范围外用对象句柄引用类成员.如果在类定义中定义成员函数,则该成员函数自动成为内联函数。在类体之外定义成员函数时,可以用关键字inline指定其为内联函数。注意,编译器有权不把内联函数放进程序块中。内联函数虽然可提高程序性能,但不是良好软件工程提倡的,因为类的客户能看到函数实现方法。只有最简单的成员函数才能在类体中定义。接口与实现方法的分离:类接口是指类定义中声明的public成员函数的原型,类的实现方法是指成员函数的定义。在类定义中(通过函数原型)声明成员函数而在类定义外定义这些成员函数,可以区分类的接口与实现方法。这样可以实现良好的软件工程,类的客户不能看到类成员函数的实现方法。建立C+程序时,通常类的定义放在头文件中,类的成员函数定义放在相同基本名字(扩展名前的部分)的源代码文件中,源代码文件被编译成目标模块(.obj文件)。在使用类时,在头文件中包含要使用的类的头文件(#include),然后系统由这个被包含的头文件连接其对应的目标码。这样我们就可以使用这个类的全部功能了。注意,头文件对应的源文件名建议与头文件名的基本名字相同,但即便不同也不会出错。正是C+的这种编程模式催生了独立软件供应商(ISV)。类的客户使用类时不需要访问类的源代码,但客户需要连接类的目标码。ISV提供类库进行销售和发放许可证,ISV只在产品中提供头文件和目标模块,不提供专属信息(例如源代码)。因此C+用户可以享用更多的ISV生产的类库。尽管如此,类的private成员列在头文件的类定义中,客户虽然无法访问private成员,但能够看到这些成员。不过可以通过代理类从类的客户中隐藏类的private数据。不熟悉面向对象编程的人常常担心对象会很大,因为它们要包含数据和函数。逻辑上的确如此,程序员可以把对象看成是包含数据和函数的,但实际中并不是这样。实际对象只包含数据。对类名或该类的对象采用sizeof运算符时,只得到该类的数据长度。编译器生成独立于所有类对象的类成员函数副本(只有一份)。当然,因为每个对象的数据是不同的,所以每个对象需要自己的类数据副本(多份类数据成员副本)。该函数代码是不变的(或称为可重入码或纯过程),因此可以在一个类的所有对象之间共享。尽管sizeof不计算成员函数的大小,但当类包含一个或几个虚函数时,就会在类对象的内存分配时多加一个指针的大小,看下面例子:class Basepublic:Base() Base() virtual void f(int) coutThanksendl;virtual void g(int) coutendl;coutsizeof(Base)endl;/输出4,指针对象的大小均为4。类的封装与类的接口:用private声明类的数据成员可以实现信息隐藏,它只供类的成员函数(或友元函数)访问,其它函数是无法访问到它。不过类提供了public接口来访问这些私有成员。看下面例子:class Basepublic:Base(int x) value = x;int getData() const return value;private:int value;void main(void)Base b(59);coutb.value;/error,main函数无法访问类的私有成员value。coutb.getData()endl;/输出59,体会类的public成员函数的接口作用。类的这种封装性使类的客户不必关心类中的实际数据表达,即不必关心类中的成员函数是怎么利用类的数据成员实现某种功能的。类只需要向客户提供类的接口(public成员函数)即可。接口的具体含义是成员函数本身以及函数使用的规格,比如函数参数等。因此,客户只需要掌握类的接口的使用规范,就可以使用类提供的功能了。类的这种封装性还提高
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号