




已阅读5页,还剩4页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第一章从C到C+ 1、利用常量 C语言中利用define预定义符定义符号常量,C+中利用const关键字定义常量,其好处是定义的常量具有数据类型。 2、内联函数 对于一些函数体代码不大,但又被频繁调用的函数,利用内联函数可以提高效率。但是内联函数的代价是需要占用更多的空间,如果程序在10个不同的地 方调用了同一个内联函数,则程序将包含该函数的10个代码的拷贝。所以内联函数的实际是用空间来换时间空间开销增大了,时间开销减少了。 在函数的定义处加上inline关键字说明函数为内联函数,但只是向编译器发出内联的请求,编译器在编译的时候未必会把该函数编译为内联函数。内联函数和带参数的宏的区别:内联函数是通过传递参数实现的,而不是通过简单的文本替换来实现的。 注意: (1)内联函数通常不能包括复杂结构的控制语句:如switch、while、复杂语句嵌套,否则,系统将作为普通函数处理。 (2)递归函数不能作为内联函数。 (3)内联函数适合只有15行的小函数 (4)在类结构中,在类体中定义的成员函数都是内联函数。 3、函数重载 带有默认参数的函数重载常引起二义性。如以下三个函数: intfun(intm,intn,intj=5) intfun(intm,intn=3,intj=5) intfun(intm=1,intn=3,intj=5) 在调用fun(1,3,5)时,系统将产生二义性,因为都严格匹配上面的三个函数,所以编译器不知道要调用哪一个。 4、函数模板 函数模板是通用的函数描述,它们使用通用类型来定义函数,其中的通用类型可以是具体的类型(如int或double)替换。通过将类型作为参数传递给模板,可使编译器生成该类型的函数。 templatevoidSwap(T&a,T&b) Ttmp; tmp=a; a=b; b=tmp; intmain() inta=10,b=20; floatx=3.14f,y=8.71f; coutBeforeswap:endl; coutabendl; coutxyendl; Swap(a,b); Swap(x,y); coutAfterswap:endl; coutabendl; coutxy成员名”或者“(*this).成员名”来表示当前对象中的某个成员。 5、构造函数 构造函数的特性: (1)构造函数的名字必须和类名一致 (2)构造函数可以带参数,但是不能有返回值 (3)定义对象时,编译系统自动调用构造函数 (4)构造函数不能像其它成员函数那样被显示地调用,它是在定义对象的同时被调用。 (5)构造函数可以有多个,如果没有定义构造函数,系统会提供一个默认的构造函数,(6)它只负责创建对象,不做任何的初始化操作。 拷贝构造函数:通过已存在的对象创建一个新对象。 类名(const类名&ob) /拷贝构造函数体 如果没有编写自定义的拷贝构造函数,C+会自动将一个已存在的对象复制给新对象,这种按成员逐一复制的过程由默认的拷贝构造函数自动完成。 拷贝构造函数和缺省的拷贝构造函数区别在于:拷贝构造函数用自定义的拷贝构造函数所给出的算法初始化新对象的数据成员,也就是说已知对象和新对象有区别。而采用缺省的拷贝构造函数初始化对象,则新对象和已知对象一致。 在C+程序中,如果使用默认构造函数创建两个对象,则这两个对象指向同一个资源,这中拷贝称之为浅拷贝,若使用自定义的拷贝构造函数创建两个对象,则这两个对象指向不同的资源,这种拷贝称为深拷贝。 以下是一个深拷贝的一个例子: #include usingnamespacestd; classstudent public: student(char*sn) coutconstructingsnendl; sname=newchar(strlen(sn)+1); if(sname!=NULL) strcpy(sname,sn); student(student&s) coutcopyendl; sname=newchar(strlen(s.sname)+1); if(sname!=NULL) strcpy(sname,s.sname); student() coutdestructingsnameendl; deletesname; sname=NULL; protected: char*sname; ; intmain() studentp1(wang); studentp2(p1); return0; 在VC下编译能通过,但是在运行时出错了。但是在linux环境下,g+编译和运行都正确。我估计在VC下都当成浅拷贝了。 6、析构函数 一个类只能有一个析构函数,没有参数,没有返回值,用户可以自己定义析构函数,也可以使用编译系统生成的默认析构函数。 析构调用过程是构造顺序的逆过程。最先构造的对象,最后析构。 由于析构函数不能带参数,故一个类中只能有一个析构函数。一般来说,如果一个类中定义了虚函数,析构函数也应定义为虚析构函数,其主要用来完成对象消亡之前做一些清理工作,比如释放内存等。 一般情况下类的析构函数作用是:释放内存资源,而此析构函数不能被调用的话会造成内存泄漏。此时将析构函数定义为虚函数就特别重要。 7、成员初始化列表及初始化 在进行含有对象成员的类对象的初始化时间,首先按照类定义对象成员的顺序来分别调用各自的对象成员所对用的构造函数,然后再执行该类自己定义的构造函数。 8、继承 子类继承父类之后,如果修改了父类的方法,在调用父类的方法的时候,要使用(子类的对象).父类名:(方法名)来调用。 #include usingnamespacestd; classBase public: voidfun() coutInBaseendl; ; classPai:publicBase public: voidfun() coutInPaiendl; ; intmain() Paia; a.Base:fun(); a.fun(); return0; 第三章多态 1、虚函数 C+支持两种类型的多态性,一种是编译时多态,一种是运行时多态。 (1)编译时的多态性:也称静态多态,是通过函数的重载来实现的,到底执行哪一个重载版本在编译时就知道了。 (2)运行时的多态性:也称动态多态,是直到系统运行时,才根据实际情况决定实现何种操作。C+中,运行时的多态性通过虚函数机制来实现。 编译时的多态性具有运行速度快的特点,而运行时的多态性则带来了高度灵活和抽象的特点,也就是说,到底运行哪个函数版本,需要在运行时通过找出发送消息的对象来确定,编译器在编译时采用的是动态联编的手段。 动态联编的一个例子: #include usingnamespacestd; classShape public: virtualvoidArea() cout这是基类形状类的求面积函数endl; ; classRectangle:publicShape public: voidArea() cout这是派生类矩形的求面积函数Area(); pShape=&rect1;/指针pShape指向Rectangle对象rect1 pShape-Area(); return0; 2、纯虚函数 纯虚函数的一般格式为: Virtual返回类型函数名(参数表)=0 (1)定义纯虚函数时,没有实现部分,不能产生对象,不能被直接调用 (2)“=0”本质上是将指向函数体的指针定义为NULL,纯虚函数仅起提供一个与派生类相一致的接口作用,用于派生类中具有相同名字的函数的存放处。 (3)在派生类中必须有重新定义的纯虚函数的函数体,即使再次声明该函数为纯虚函数。 3、抽象类 如果一个类中,至少有一个纯虚函数,那么称该类为抽象类。抽象类不能实例化,它只是将许多相关的类组织起来,提供一个公共的基类,而那些被它组织在一起的具体的类由它派生出来。 #include usingnamespacestd; classCMenu/抽象类 public: virtualvoidfunc()=0;/纯虚函数 ; classCFormMenu1:publicCMenu public: voidfunc() cout你选择的是新建文件菜单endl; ; classCFormMenu2:publicCMenu public: voidfunc() cout你选择的是打开文件菜单endl; ; classCFormMenu3:publicCMenu public: voidfunc() cout你选择的是保存文件菜单endl; ; intmain() intchoice; CMenu*f3;/定义一个基类的指针数组 f0=newCFormMenu1; f1=newCFormMenu2; f2=newCFormMenu3; do cout1:新建文件.endl; cout2:打开文件.endl; cout3:保存文件.endl; cout0:退出程序.choice; if(choice=1&choicefunc(); while(choice!=0); return0; 第四章类模板和重载 1、类模板 类模板只是模板的定义,不是一个实在的类,类模板是对象的抽象,代表一种类型的类,这些类具有相同的功能,但是数据成员类型及成员函数返回类型和形参类型不同。 实例化类模板是将一个通用的类模板生成一个具体的类,因此说,模板类是类模板的实例,代表一个具体的类。模板类可以定义类对象,而类模板不能定义对象,因此说模板类才是实实在在的类。 #include usingnamespacestd; template classCDemo public: CDemo(Tt1,Tt2,Tt3); TMin(); TMax(); private: Tx,y,z; ; template/在类外定义的成员函数,需要加上这条,来指明它是类模板的成员 CDemo:CDemo(Tt1,Tt2,Tt3):x(t1),y(t2),z(t3) return; template TCDemo:Min() Tmin=x; if(ymin)min=y; if(zmin)min=z; returnmin; template TCDemo:Max() Tmax=x; if(ymax)max=y; if(zmax)max=z; returnmax; intmain() CDemoexample(1,2,3); coutexample.Max()endl; coutexample.Min()endl; return0; 2、运算符重载 C+中大部分的运算符可以重载,但是如下表所示的运算符不能重载。 运算符 运算符名称 禁止重载的理由 ?: 三目条件运算符 C+中没有定义三目运算符的语法 . 成员操作符 为保证成员操作符对成员访问的安全性 : 作用域操作符 该操作符右操作数不是表达式 sizeof 类型长度操作符 该操作符的操作数为类型名,不是表达式 运算符的重载形式有两种:重载为类的成员函数和重载为类的友员函数。这两种形式都可以访问类的私有成员。成员函数是用this指针隐式地访问类对象的某个参数,友员函数的调用必须明确列出该参数。 当运算符函数是一个成员函数时,最左边的操作数(或者只有最左边的操作数)必须是运算符类的一个类对象(或者是该对象的引用)。如果左边的操作数 必须是不同类的对象,或者是一个内部类型的对象,该运算符函数必须作为一个非成员函数(通常是友员函数)来实现。选择友员函数重载运算符的另一个原因是使 运算符具有可交换性。例如:给定正确的重载运算符定义,运算符左边的参数可以是其它数据成员的对象。 特别需要注意的是:当运算符重载为类的成员函数时,函数的参数个数比原来的操作数的个数要少一个(“+”,“”除外);当重载为类的友员函数时,参数个数和原来的操作数的个数相同。 3、异常处理 #include usingnamespacestd; classBase public: voidshow() coutBaseobjectendl; ; cla
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 洞身管棚施工方案
- 平顶山全网营销方案公司
- 大连商场线下活动策划方案
- 卷烟工艺质量题库及答案
- 潍坊普通话考试题及答案
- DB65T 4350-2021 印染废水治理工程技术规范
- 第1节 化学反应的方向教学设计-2025-2026学年高中化学鲁科版2019选择性必修1 化学反应原理-鲁科版2019
- 2.1 实验:探究小车速度随时间变化的规律教学设计(1)-人教版高中物理必修第一册
- DB65T 4451-2021 氯酸盐和高氯酸盐的检测目视化学比色法
- DB65T 4425-2021 有机食品原料 小麦栽培技术规程
- 减重代谢护理案例分享
- 给水排水管道工程施工质量评定表
- 医院与慈善机构捐赠协议
- 高职数学课件 1.1函数
- 自建房屋地基施工合同
- GB/T 5526-2024动植物油脂相对密度的测定
- 北师大版 五年级上册数学 预习单
- 精神科意外事件防-噎食
- 2024年度吉林省高校教师资格证之高等教育学考试题库
- 九一八知识竞赛题50题
- 《人皆有不忍人之心》 统编版高中语文选择性必修上册
评论
0/150
提交评论