C++语言程序设计.ppt_第1页
C++语言程序设计.ppt_第2页
C++语言程序设计.ppt_第3页
C++语言程序设计.ppt_第4页
C++语言程序设计.ppt_第5页
已阅读5页,还剩43页未读 继续免费阅读

下载本文档

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

文档简介

1、, C+语言程序设计 第二次直播课堂 主讲 首都经贸大学 李宁 副教授,一、关于函数原形和头文件,函数的定义和函数的原型 例:double cubic(double d) /定义 return d*d*d;double cubic(double d); /原形,函数原形提供了生成函数调用代码所必须的接口信息,因此: 在函数的调用处之前,需通过函数原形提供该调用函数的接口信息。,函数定义也能提供同样的接口信息,因此: 如果函数的定义出现在函数调用处之前,函数原形即可省略。,但是,通过函数定义来担负函数原形的任务存在着下列问题: 函数的定义必须出现在函数调用的同一文件中,限制了函数的使用范围;,函

2、数定义必须以源程序的形式呈现,不便于将之作为产品提供; 不便于实现大系统,不便于分工。,应尽可能做到函数的实现(定义)与函数的使用(调用)的分离: 首先设计函数原形,作为函数定义和函数调用必须共同遵守的接口标准; 将定义函数的程序和使用函数的程序放在不同文件中。,头文件以固定的、便于利用的形式保存一组函数的调用接口信息,确保了接口信息描述的正确性和一致性。 用#include命令将头文件插入到需要的程序文件中,二、关于函数模板,什么情况下不可省略模板实参? 无法通过模板函数的参数隐含获得相关信息的模板参数; 在任何不可省略参数前面的模板参数。,例1: templateT2 Max(T1 x,

3、T3 y) return T3(T3(x)T3(y)? x : y); /定义 cout(3,3.5); /调用 提示:未出现在模板函数参数表中的模板参数,其实参不得省略。,template void sumAll(Type dataCols, Type result) for(int i=0;iRows;i+) resulti=0; for(int j=0;jCols;j+) resulti+=dataij; /定义,例2(教材例5.10):,int d3= 1,2,3,2,3,4, 4,5,6,6,7,8;int r4;sumAll(d,r);/调用 提示:对于普通类型(非虚拟类型)的模板

4、参数,其实参不得省略。,template. . . /定义 . . . sumAll(d,r); /调用 提示:通过调整模板参数的顺序,有可能使更多的模板实参可以省略。,例3:,三、关于参数表中的数组,参数表中的数组就是指针 因此,定义参数表中的数组时不必给出第一维的大小; 因此,对于参数表中的数组,也可以定义为指针,对应关系是: A *A; A (*A),因此,调用这样的函数时,只需以数组名作为实参; 因此,修改形参数组就是在修改形参指针所指向的数据,也就是在修改实参数组。但这并不违反“传值”原则,因为对应于形参的实参数组名(指针)并没有被修改;,四、动态空间的使用应避免的问题,悬挂访问:通

5、过一个没有初始化的指针或空指针访问不存在的数据; 存储泄漏:申请的动态空间用完后被丢弃,没有释放;,重复释放:同一动态空间被多次释放; 申请操作与释放操作不配套例如用 malloc() 申请,用 delete释放;或用 new 申请,用 free() 释放。,五、两种重要的构造函数,无参构造函数 指: 未定义参数的构造函数,或 : 所有参数均为可选参数的构造函数。,如果类中包含一个类对象数据成员,而类的构造函数又没有对之进行初始化,则系统隐含调用该成员所属类的无参构造函数进行初始化。,对于派生类,构造函数没有对基类进行初始化,则系统隐含调用基类的无参构造函数进行初始化。 每个类至少要有一个构造

6、函数。如果没有定义,系统自动生成一个形如 X() 的默认无参构造函数。,由于无参构造函数有可能被隐含调用,因而类中通常应该有无参构造函数。如果类中已经定义了若干构造函数,应检查其中是否包含无参构造函数,如没有,应添加一个。,class XX int xx; public: XX(int n=0):xx(n) . ;,class YY XX xd; double yy; public: YY(double d):yy(d) /YY():xd( ),yy(d) . ;,隐含调用无参构造函数例1,class YY XX xd; double yy; public: YY(double d):yy(d

7、) ;,class ZZ:public YY long k; public: ZZ(long m):k(m) /错误! ;,隐含调用无参构造函数例2,拷贝构造函数 指:参数中只包含一个同类对象引用的构造函数。 用于创建一个与参数所引用对象相同的对象,这种创建对象的方式称为拷贝(复制,克隆)。,在调用一个具有类对象参数的函数时,系统隐含地以实参对象为参数调用拷贝构造函数,创建形参对象。 对于返回值为类对象的函数,在用return 返回时,系统隐含地以标return 语句中的对象为参数调用拷贝构造函数,创建作为返回值的对象。,每个类至少要有一个拷贝构造函数。如果没有定义,系统自动生成一个默认的拷贝

8、构造函数,它以“浅层复制”的方式构造新对象。 对于必须通过“深层复制”才能正确构造相同对象的情况,应当定义专门的拷贝构造函数。,假定class Stringchar *p;public:String(const char *c)p=c; ;中没有定义拷贝构造函数,,则执行 String s1(This is a string); String s2(s1);的效果是:,“浅层复制示意,在 String 中增加如下的拷贝构造函数,实现“深层复制” :String:String(String 这样,执行同样的语句序列的效果是:,“深层复制”示意,如果定义了专门的拷贝构造函数,一般也就需要重载专门的

9、赋值操作符。 例如,String 中就应重载赋值操作符 = 如下:,String,六、关于操作符的特性,操作数个数 优先级和结合性 是否要求第一操作数必须是变量或视同变量的数据,是否有副作用(是否修改第一操作数) 操作结果是否为视同变量的数据(是否就是第一操作数),七、关于操作符重载,应保持操作符原有的基本语义,重载的操作符应体现为原操作符功能在新的数据类型中的延伸 应尽量保持操作符原有的特性,优先级、结合性和操作数个数这三个特性自动得以保持 +=、*=、+(前增1)等操作符要求第一操作数必须是变量;当作为非成员函数重载这类操作符时,为了达到同样效果,第一参数应说明为引用,=、+=、*=、+等

10、具有副作用的操作符,除后增1、后减1之外,其操作结果视同变量。当重载这类操作符时,为了达到同样效果,返回值应说明为引用,return 语句应返回第一参数(对于非成员函数重载),或返回*this(对于成员函数重载),例如,例 8.1 的 Fraction 类(分数类)中重载了前增1操作符: Fraction ,因此执行 Fraction x(2,3); +x; 后,x 变为 8/3,操作符的重载应当配套 如果重载了+、-,应考虑同时重载 +、- 如果重载了=,应应考虑同时重载!= 如果重载了,应应考虑同时重载,作为成员函数重载还作为非成员函数重载? 某些操作符只能作为成员函数重载,包括:=、 、( )、-以及所有类型转换操作符 。,若第一操作数不是同类对象,而是其他数据类型,则只能作为非成员函数重载(如输入输出流操作符 和 )。,其他情况既可作为成员函数,也可作为非成员函数重载。 作为非成员函数重载时,可将其声明为友元。,使用引用参数还是非引用参数? 使用引用参数可减少参数传递过程中的数据复制量 如果操作符作为非成员函数重载,且该操作符要修改第一操作数(如+

温馨提示

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

评论

0/150

提交评论