C语言程序的设计解读

上传人:xmg****18 文档编号:120247412 上传时间:2020-02-05 格式:PPT 页数:49 大小:1.30MB
返回 下载 相关 举报
C语言程序的设计解读_第1页
第1页 / 共49页
C语言程序的设计解读_第2页
第2页 / 共49页
C语言程序的设计解读_第3页
第3页 / 共49页
C语言程序的设计解读_第4页
第4页 / 共49页
C语言程序的设计解读_第5页
第5页 / 共49页
点击查看更多>>
资源描述

《C语言程序的设计解读》由会员分享,可在线阅读,更多相关《C语言程序的设计解读(49页珍藏版)》请在金锄头文库上搜索。

1、 C C 语言程序设计语言程序设计 2 2 一 关于函数原形和头文件一 关于函数原形和头文件 函数的定义和函数的原型函数的定义和函数的原型 例 例 double cubicdouble cubic double d double d 定义定义 return d d d return d d d double cubicdouble cubic double d double d 原形原形 3 3 函数原形提供了生成函数调函数原形提供了生成函数调 用代码所必须的接口信息 用代码所必须的接口信息 因此 因此 在函数的调用处之前 需通过 函数原形提供该调用函数的接 口信息 4 4 函数定义也能提供同

2、样的接函数定义也能提供同样的接 口信息 因此 口信息 因此 如果函数的定义出现在函数调 用处之前 函数原形即可省略 5 5 但是 通过函数定义来担负但是 通过函数定义来担负 函数原形的任务存在着下列函数原形的任务存在着下列 问题 问题 函数的定义必须出现在函数调 用的同一文件中 限制了函数 的使用范围 6 6 函数定义必须以源程序的形式 呈现 不便于将之作为产品提 供 不便于实现大系统 不便于分 工 7 7 应尽可能做到函数的实现 定应尽可能做到函数的实现 定 义 与函数的使用 调用 的义 与函数的使用 调用 的 分离 分离 首先设计函数原形 作为函数定 义和函数调用必须共同遵守的接 口标准

3、将定义函数的程序和使用函数的 程序放在不同文件中 8 8 头文件以固定的 便于利用的形头文件以固定的 便于利用的形 式保存一组函数的调用接口信息式保存一组函数的调用接口信息 确保了接口信息描述的正确性 确保了接口信息描述的正确性 和一致性 和一致性 用用 include include命令将头文件插入到命令将头文件插入到 需要的程序文件中需要的程序文件中 9 9 二 关于函数模板二 关于函数模板 什么情况下不可省略模板实什么情况下不可省略模板实 参 参 无法通过模板函数的参数隐含 获得相关信息的模板参数 在任何不可省略参数前面的模 板参数 1010 例例1 1 templatetemplate

4、 T2 Max T1 x T3 y T2 Max T1 x T3 y return T3 T3 x T3 y x y return T3 T3 x T3 y x y 定义定义 cout Max 3 3 5 cout Max 3 3 5 调用调用 提示 未出现在模板函数参数表中提示 未出现在模板函数参数表中 的模板参数 其实参不得省略 的模板参数 其实参不得省略 1111 template typename Type template int Rows int Cols void sumAll Type data Cols void sumAll Type data Cols Type resu

5、lt Type result for int i 0 i Rows i for int i 0 i Rows i result i 0 result i 0 for int j 0 j Cols j for int j 0 j Cols j result i data i j result i data i j 定义定义 例例2 2 教材例 教材例5 105 10 1212 int d 3 int d 3 1 2 3 2 3 4 1 2 3 2 3 4 4 5 6 6 7 8 4 5 6 6 7 8 int r 4 int r 4 sumAll d r sumAll d r 调用调用 提示 对

6、于普通类型 非虚拟类型提示 对于普通类型 非虚拟类型 的模板参数 其实参不得省略 的模板参数 其实参不得省略 1313 template int Rows int Cols template typename Type 定义定义 sumAll d r sumAll d r 调用调用 提示 通过调整模板参数的顺序 提示 通过调整模板参数的顺序 有可能使更多的模板实参可以省略有可能使更多的模板实参可以省略 例例3 3 1414 三 关于参数表中的数组三 关于参数表中的数组 参数表中的数组就是指针参数表中的数组就是指针 因此 定义参数表中的数组时不因此 定义参数表中的数组时不 必给出第一维的大小 必

7、给出第一维的大小 因此 对于参数表中的数组 也因此 对于参数表中的数组 也 可以定义为指针 对应关系是 可以定义为指针 对应关系是 A A A A A A A A 1515 因此 调用这样的函数时 只需因此 调用这样的函数时 只需 以数组名作为实参 以数组名作为实参 因此 修改形参数组就是在修改因此 修改形参数组就是在修改 形参指针所指向的数据 也就是形参指针所指向的数据 也就是 在修改实参数组 但这并不违反在修改实参数组 但这并不违反 传值传值 原则 因为对应于形参的原则 因为对应于形参的 实参数组名 指针 并没有被修实参数组名 指针 并没有被修 改 改 1616 四 动态空间的使用应避免的

8、四 动态空间的使用应避免的 问题问题 悬挂访问 通过一个没有初始化悬挂访问 通过一个没有初始化 的指针或空指针访问不存在的数的指针或空指针访问不存在的数 据 据 存储泄漏 申请的动态空间用完存储泄漏 申请的动态空间用完 后被丢弃 没有释放 后被丢弃 没有释放 1717 重复释放 同一动态空间被多次重复释放 同一动态空间被多次 释放 释放 申请操作与释放操作不配套申请操作与释放操作不配套 例如用例如用 malloc malloc 申请 用申请 用 deletedelete释放 或用释放 或用 new new 申请申请 用 用 free free 释放 释放 1818 五 两种重要的构造函数五 两

9、种重要的构造函数 无参构造函数无参构造函数 指 未定义参数的构造函数 或 所有参数均为可选参数的构 造函数 1919 如果类中包含一个类对象数据 成员 而类的构造函数又没有 对之进行初始化 则系统隐含 调用该成员所属类的无参构造 函数进行初始化 2020 对于派生类 构造函数没有对 基类进行初始化 则系统隐含 调用基类的无参构造函数进行 初始化 每个类至少要有一个构造函数 如果没有定义 系统自动生 成一个形如 X 的默认无 参构造函数 2121 由于无参构造函数有可能被隐含 调用 因而类中通常应该有无参 构造函数 如果类中已经定义了 若干构造函数 应检查其中是否 包含无参构造函数 如没有 应

10、添加一个 2222 class XX class XX int xx int xx public public XX int n 0 xx n XX int n 0 xx n class YY class YY XX xd XX xd double yy double yy public public YY double d yy d YY double d yy d YY xd yy d YY xd yy d 隐含调用无参隐含调用无参 构造函数例构造函数例1 1 2323 class YY class YY XX xd XX xd double yy double yy public pub

11、lic YY double d yy d YY double d yy d class ZZ public YY class ZZ public YY long k long k public public ZZ long m k m ZZ long m k m 错误 错误 隐含调用无参隐含调用无参 构造函数例构造函数例2 2 2424 拷贝构造函数拷贝构造函数 指 参数中只包含一个同类对 象引用的构造函数 用于创建一个与参数所引用对 象相同的对象 这种创建对象 的方式称为拷贝 复制 克隆 2525 在调用一个具有类对象参数的函数 时 系统隐含地以实参对象为参数 调用拷贝构造函数 创建形参对象

12、 对于返回值为类对象的函数 在用 return 返回时 系统隐含地以标 return 语句中的对象为参数调用拷 贝构造函数 创建作为返回值的对 象 2626 每个类至少要有一个拷贝构造函 数 如果没有定义 系统自动生 成一个默认的拷贝构造函数 它 以 浅层复制 的方式构造新对象 对于必须通过 深层复制 才能正 确构造相同对象的情况 应当定 义专门的拷贝构造函数 2727 假定假定 class String class String char p char p public public String const char c p c String const char c p c 中没有定义拷

13、贝构造函数 中没有定义拷贝构造函数 2828 则执行则执行 String s1 String s1 This is a stringThis is a string String s2 s1 String s2 s1 的效果是 的效果是 2929 T T h h i i s si i s sa a s s t t r r i i n n g g p s2 p s1 浅层复制 示意浅层复制 示意 3030 在在 String String 中增加如下的拷贝构造中增加如下的拷贝构造 函数 实现函数 实现 深层复制深层复制 String String String p new char strlen

14、 s p 1 strcpy p s p strcpy p s p 这样 执行同样的语句序列的效果这样 执行同样的语句序列的效果 是是 3131 深层复制深层复制 示意示意 T T h h i i s si i s sa a s s t t r r i i n n g g T T h h i i s si i s sa a s s t t r r i i n n g g p s2 p s1 3232 如果定义了专门的拷贝构造函 数 一般也就需要重载专门的 赋值操作符 例如 例如 String String 中就应重载赋值中就应重载赋值 操作符操作符 如下 如下 3333 String if p

15、delete p p new char strlen s p 1 p new char strlen s p 1 strcpy p s p strcpy p s p return this return this 3434 六 关于操作符的特性六 关于操作符的特性 操作数个数操作数个数 优先级和结合性优先级和结合性 是否要求第一操作数必须是变量是否要求第一操作数必须是变量 或视同变量的数据或视同变量的数据 3535 是否有副作用是否有副作用 是否修改第一操作数 是否修改第一操作数 操作结果是否为视同变量的数据操作结果是否为视同变量的数据 是否就是第一操作数 是否就是第一操作数 3636 视同常

16、量视同常量 其他其他 视同变量视同变量 任意任意 间接访问间接访问无无 nume deno return this return this 4141 因此执行因此执行 Fraction x 2 3 x Fraction x 2 3 x 后 后 x x 变为变为 8 38 3 4242 操作符的重载应当配套操作符的重载应当配套 如果重载了 应考虑同时重 载 如果重载了 应应考虑同时重 载 如果重载了 应应考虑同时重 载以及所有类型转换操作符 4444 若第一操作数不是同类对象 而是其他数据类型 则只能作 为非成员函数重载 如输入输 出流操作符 和 4545 其他情况既可作为成员函数 也可作为非成员函数重载 作为非成员函数重载时 可将 其声明为友元 4646 使用引用参数还是非引用参数 使用引用参数还是非引用参数 使用引用参数可减少参数传递过 程中的数据复制量 如果操作符作为非成员函数重载 且该操作符要修改第一操作数 如 则代表第一操作数的 第一参数必须是引用参数 4747 使用非引用参数可利用只需一个实参 的构造函数实现类型的自动转换 例 例例 例 8 1 8 1 中中 增加构造函数 增

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 大杂烩/其它

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号