高质量C编程指南第6章函数设计
第6章C语言
float
*point;
定义了一个指向浮点型数据的指针变量point,即point是一个 用于存放浮点型变量地址的变量。
6.1.2 指针变量的定义与初始化
在此定义中,基类型声明了该指针变量所指向的 实体的类型。如:一个指向float类型的指针变量,它 的基类型应该为float型;一个指向int类型的指针变 量,它的基类型应该为int型。“*”是一个标识,用 以说明该变量是一个具有指针类型的变量。对于指针 变量的变量名的命名也应该尽量做到“见名知义”。 需要注意的是,指针变量名为“point”,而非 “*point”。
第6章
指针
山东大学电气工程学院
第6章Байду номын сангаас指针
指针是C语言中一个非常重要的概念,它对于变量的引用、数组 的处理、字符串的操作、函数参数的调用及函数间数据的处理、 结构体的应用和文件的操作等等都起着相当重要的作用。正确的 运用指针不仅可以提高程序的执行效率,简化操作过程,而且可 以处理复杂的数据操作,实现动态的数据结构,完成形式多样的 参数传递以及灵活的修改形参与实参的数值。但是需要警惕的是, 因为指针的运用如此的灵活,以至于经常会出现一些意想不到的 错误和结果。甚至在某些情况下,错误的运用指针,会使程序受 到非常严重的破坏。因此可以说,正确的理解和运用指针是衡量 能否成功的编写高质量C程序的标准。
6.1.3 与指针有关的运算符
在C语言中有三个与指针有关的运算符: 1、“&”运算符 此运算符称为取地址运算符。通过取地址运算符“&”可以获得 一个变量的地址。“&”为单目运算符,运算方向为从右向左结合, 直接作用于一个变量前,表示该变量的地址。 例如: int x=10,*p1;
高质量程序设计指南:C++C语言(第3版)(修订版)
⾼质量程序设计指南:C++C语⾔(第3版)(修订版)第1章⾼质量软件开发之道本章讲述⾼质量软件开发的道理。
为了深⼊理解软件质量的概念,本章阐述了10个重要的软件质量因素,即正确性、健壮性、可靠性、性能、易⽤性、清晰性、安全性、可扩展性、兼容性和可移植性,并介绍了消除软件缺陷的基本⽅法。
⼈们开发软件产品的⽬的是赚钱。
为了获得更多的利润,⼈们希望软件开发⼯作“做得好、做得快,并且少花钱”,所以软件质量并不是⼈们唯⼀关⼼的东西。
本章论述了“质量、⽣产率和成本”之间的关系,并给出了能够“提⾼质量、提⾼⽣产率,并且降低成本”的软件开发⽅法。
1.1 软件质量基本概念典型的或本质的特征;②事物固有的或区别于其他事物的优良或出⾊的程度。
对质量的定义是:①⼀个系统、组件或过程符合特定需求的程度;②⼀。
“正确性”的确很重要,。
如果开发⼈员每天都要⾯对那么多(修订版)的质量属性咬⽂嚼字,不久就会迂腐得像孔⼄⼰,因此我们有必要对质量属性做些分类和整合。
质量属性可分为两⼤类:“功能性”与“⾮功能性”,后者有时也称为“能⼒”(Capability)。
从实⽤⾓度出发,本章将重点论述“10⼤”质量属性,如表1-1所⽰。
表1-1 “10⼤”软件质量属性功能性正确性(Correctness)健壮性(Robustness)可靠性(Reliability)⾮功能性性能(Performance)易⽤性(Usability)清晰性(Clarity)安全性(Security)可扩展性(Extendibility)兼容性(Compatibility)可移植性(Portability)其中,功能性质量属性有3个:正确性、健壮性和可靠性;⾮功能性质量属性有7个:性能、易⽤性、清晰性、安全性、可扩展性、兼容性和可移植性。
为什么碰巧是“10⼤”呢?不为什么,只是⽅便记忆⽽已(如同国际、国内经常评“10⼤”那样)。
为什么“10⼤”⾥⾯不包括可测试性、可维护性、灵活性呢?它们不也是很重要的吗?它们是很重要,但不是软件产品的卖点,所以挤不进“10⼤”⾏列。
高质量C++/C编程指南实务精选罕见资源大集合
根据上述定义,马上得到第一推论:我既不是高手也算不上是老手。
在写此书前,我阅读了不少程序设计方面的英文著作,越看越羞惭。因为发现自己连编程基本技能都未能全面掌握,顶多算是二流水平,还好意思谈什么老手和高手。希望和我一样在国内土生土长的程序员朋友们能够做到:
2.8 类的版式 21
第3章 命名规则 22
3.1 共性规则 22
3.2 简单的WINDOWS应用程序命名规则 23
3.3 简单的UNIX应用程序命名规则 25
第4章 表达式和基本语句 26
4.1 运算符的优先级 26
4.2 复合表达式 27
4.3 IF 语句 27
4.4 循环语句的效率 29
9.2 构造函数的初始化表 70
9.3 构造和析构的次序 72
9.4 示例:类STRING的构造函数与析构函数 72
9.5 不要轻视拷贝构造函数与赋值函数 73
9.6 示例:类STRING的拷贝构造函数与赋值函数 73
9.7 偷懒的办法处理拷贝构造函数与赋值函数 75
9.8 如何在派生类中实现类的基本函数 75
我们有充分的理由疑虑:
(1)编程老手可能会长期用隐含错误的方式编程(习惯成自然),发现毛病后都不愿相信那是真的!
(2)编程高手可以在某一领域写出极有水平的代码,但未必能从全局把握软件质量的方方面面。
事实证明如此。我到上海贝尔工作一年来,陆续面试或测试过近百名"新""老"程序员的编程技能,质量合格率大约是10%。很少有人能够写出完全符合质量要求的if语句,很多程序员对指针、内存管理一知半解,......。
高质量C编程指南(1)
高质量CC编程指南
高质量CC编程指南引言在当今的技术领域中,C/C++是广泛应用于开发底层系统和高性能应用的编程语言。
然而,由于其灵活性和强大的功能,C/C++也很容易出现一些常见的编程错误和陷阱。
本文将介绍一些编写高质量C/C++代码的指南,旨在帮助开发人员编写可靠、高效且易于维护的代码。
1. 规范与一致性一个好的编程指南可以提供一套规范和指导,确保代码风格的一致性。
以下是一些关于如何编写高质量C/C++代码的最佳实践:•代码缩进:使用合理的缩进风格(如使用4个空格或制表符),以提高代码的可读性。
•命名规范:采用清晰、一致和具有描述性的变量、函数和类命名约定,以便于理解代码的含义。
•注释说明:清晰的注释可以提高代码的可读性和可维护性,应该在关键地方进行适当的注释。
•代码复用:避免重复代码,通过使用函数、类和模板来实现代码的复用。
2. 内存管理C/C++程序中的内存管理是一个关键的问题。
以下是一些建议,以确保高质量的内存管理:•避免内存泄漏:在动态分配内存之后,确保在不再使用时释放内存,以防止内存泄漏。
•避免野指针:确保避免使用已释放或未初始化的指针,这可能导致程序崩溃。
•使用智能指针:C++提供了智能指针的机制,如std::unique_ptr和std::shared_ptr,可大大简化内存管理问题。
•避免内存溢出:当使用动态分配的内存时,确保不会超出已预留的内存空间,以避免内存溢出问题。
3. 异常处理异常处理机制是C++中的一个重要特性,可以帮助我们处理程序中的异常情况。
以下是一些关键的异常处理注意事项:•合理使用异常:只在合适的地方使用异常,避免过度使用异常机制,以保持代码的简洁性和可读性。
•不要忽略异常:在捕获到异常后,应该采取适当的措施来处理异常,而不是简单地忽略它们。
•避免裸露的异常规范:应该避免在函数声明中使用裸露的异常规范,而是通过使用try-catch语句来处理异常。
4. 性能优化在开发高质量的C/C++应用程序时,性能通常是一个关键的问题。
C语言程序设计实验五:函数(5篇范例)
C语言程序设计实验五:函数(5篇范例)第一篇:C语言程序设计实验五:函数C语言程序设计实验五:函数1、定义函数返回两个数中较大的数,在主函数中通过调用该函数求三个数中较大的数并输出,编写主函数调用该函数。
说明:(1)请大家按学号来坐,便于考勤和管理。
(2)请珍惜宝贵的实验时间!不要做与实验无关的事情,比如聊QQ、上网或打游戏。
(3)直接把C语言代码粘贴到相应的实验题目下方,上交实验报告时只交word文档。
(4)文档名称:班级+学号后2位+姓名+实验编号,例如12通1班12张山实验五.doc。
第二篇:C语言程序设计实验七:函数、数组、指针C语言程序设计实验七:函数、数组、指针1、程序运行后,用户任意输入一个字符串,求出字符串长度,然后输出字符串内容及个数。
不能使用strlen函数。
求字符串长度函数的函数原型必须如下:int MyStrLenPt(char *str)若输入:nihao123!则输出:nihao123!:9 chars2、编写一个对一维数组进行排序的程序。
要求:写两个函数,一个主函数,一个sort函数。
在主函数中完成数组的输入和输出,通过调用sort函数对数组进行排序。
sort函数的原型为:voidsort(int*p, intn);说明:(1)请大家按学号来坐,便于考勤和管理。
(2)请珍惜宝贵的实验时间!不要做与实验无关的事情,比如聊QQ、上网或打游戏。
(3)直接把C语言代码粘贴到相应的实验题目下方,上交实验报告时只交word文档。
(4)文档名称:班级+学号后2位+姓名+实验编号,例如11电1班12张山实验七.doc。
第三篇:C语言程序设计—函数—实验报告实验报告专业软件工程班级X班学号_ XXXXXXXXXXX_姓名实验日期:201X年X月X日报告退发(订正、重做)课程C程序设计实验实验名称函数一、实验目的① 熟练掌握C程序中函数的定义;② 掌握函数的调用,函数参数的传递;③ 熟练掌握函数的嵌套调用和递归调用;二、实验环境(描述实验的软件、硬件环境)① 软件环境:windows xp/win7等操作系统,Microsoft Visual C++ 6.0编译器;② 硬件环境:PC机一台三、实验内容、步骤和结果分析题目一:编写一个用来判断质数(素数)的函数。
高质量CC++编程指南_林锐
高质量C++/C 编程指南文件标识: 当前版本: 1.0 作 者:林锐 博士 文件状态[ ] 草稿文件[√] 正式文件[ ] 更改正式文件完成日期:2001年7月24日版本历史版本/状态作者参与者起止日期备注V 0.9草稿文件林锐 2001-7-1至2001-7-18林锐起草V 1.0正式文件林锐 2001-7-18至2001-7-24朱洪海审查V 0.9,林锐修正草稿中的错误目录前言 (6)第1章文件结构 (11)1.1版权和版本的声明 (11)1.2头文件的结构 (12)1.3定义文件的结构 (13)1.4头文件的作用 (13)1.5目录结构 (14)第2章程序的版式 (15)2.1空行 (15)2.2代码行 (16)2.3代码行内的空格 (17)2.4对齐 (18)2.5长行拆分 (19)2.6修饰符的位置 (19)2.7注释 (20)2.8类的版式 (21)第3章命名规则 (22)3.1共性规则 (22)3.2简单的W INDOWS应用程序命名规则 (23)3.3简单的U NIX应用程序命名规则 (25)第4章表达式和基本语句 (26)4.1运算符的优先级 (26)4.2复合表达式 (27)4.3 IF 语句 (27)4.4循环语句的效率 (29)4.5 FOR 语句的循环控制变量 (30)4.6 SWITCH语句 (30)4.7 GOTO语句 (31)第5章常量 (33)5.1为什么需要常量 (33)5.2 CONST 与#DEFINE的比较 (33)5.3常量定义规则 (33)5.4类中的常量 (34)第6章函数设计 (36)6.2返回值的规则 (37)6.3函数内部实现的规则 (39)6.4其它建议 (40)6.5使用断言 (41)6.6引用与指针的比较 (42)第7章内存管理 (44)7.1内存分配方式 (44)7.2常见的内存错误及其对策 (44)7.3指针与数组的对比 (45)7.4指针参数是如何传递内存的? (47)7.5 FREE和DELETE把指针怎么啦? (50)7.6动态内存会被自动释放吗? (50)7.7杜绝“野指针” (51)7.8有了MALLOC/FREE为什么还要NEW/DELETE ? (52)7.9内存耗尽怎么办? (53)7.10 MALLOC/FREE 的使用要点 (54)7.11 NEW/DELETE 的使用要点 (55)7.12一些心得体会 (56)第8章 C++函数的高级特性 (57)8.1函数重载的概念 (57)8.2成员函数的重载、覆盖与隐藏 (60)8.3参数的缺省值 (63)8.4运算符重载 (64)8.5函数内联 (65)8.6一些心得体会 (68)第9章类的构造函数、析构函数与赋值函数 (69)9.1构造函数与析构函数的起源 (69)9.2构造函数的初始化表 (70)9.3构造和析构的次序 (72)9.4示例:类S TRING的构造函数与析构函数 (72)9.5不要轻视拷贝构造函数与赋值函数 (73)9.6示例:类S TRING的拷贝构造函数与赋值函数 (73)9.7偷懒的办法处理拷贝构造函数与赋值函数 (75)9.8如何在派生类中实现类的基本函数 (75)9.9一些心得体会 (77)第10章类的继承与组合 (78)10.2组合 (80)第11章其它编程经验 (82)11.1使用CONST提高函数的健壮性 (82)11.2提高程序的效率 (84)11.3一些有益的建议 (85)参考文献 (87)附录A :C++/C代码审查表 (88)附录B :C++/C试题 (93)附录C :C++/C试题的答案与评分标准 (97)前言软件质量是被大多数程序员挂在嘴上而不是放在心上的东西!除了完全外行和真正的编程高手外,初读本书,你最先的感受将是惊慌:“哇!我以前捏造的C++/C程序怎么会有那么多的毛病?”别难过,作者只不过比你早几年、多几次惊慌而已。
第6章软件编码一、填空题(20小题)1、源程序中加注释是帮助理解程序
第6章软件编码一、填空题(20小题)1、源程序中加注释是帮助理解程序的重要手段,注释分为( )、( )两类。
答案:序言性注释、功能性注释2、通常考虑选用语言的因素有( )、( )、( )、( )和( )。
答案:项目的应用领域、软件开发的方法、软件执行环境、算法与数据结构的复杂性、软件开发人员的知识3、从软件工程的观点,语言的工程特性是指( )、( )、( )和( )。
答案:可移植性、开发工具的可利用性、软件的可重用性、可维护性4、编写操作系统、编译系统等系统软件时,可选用( )、( )、( )和( )等。
答案:汇编语言、C语言、Pascal语言、Ada语言5、效率是一个( )要求,目标在( )给出。
答案:性能、需求分析6、提高程序效率的根本途径在于选择良好的( )、良好的( ),而不是靠编程时对程序语句做调整。
答案:设计方法、数据结构与算法7、语句构造的原则是( ),不能为了追求效率而使代码( )。
答案:简单直接、复杂化8、程序设计语言的心理特性在语言中的表现形式为( )、( )、( )、( )和( )。
答案:歧义性、简洁性、局部性、顺序性、传统性9、语言的心理特性在语言中的表现形式有:( )、( )、( )、( )和( )。
答案:歧义性、简洁性、局部性、顺序性、传统性10、程序设计语言的简洁性是指人们必须记住的( )的数量。
人们要掌握一种语言,需要记住的成分数量越多,简洁性越( )。
答案:语言成分、差11、在软件的设计中占有极其重要地位的是软件功能结构,它是联系( )跟开发者的规格说明。
答案:用户12、贯穿于软件生存期中的一个极为重要的问题是( )。
答案:软件质量13、为了做好软件质量评价,必须在( )定义其质量需求。
答案:开发前14、在McCall 质量度量模型中,针对面向软件产品的运行、修改、转移,软件质量概念包括11个特性,面向软件产品操作的5个特性是:( )、( )、( )、( )和( )。
c语言函数的课程设计
c语言函数的课程设计一、课程目标知识目标:1. 理解C语言中函数的基本概念,掌握函数的定义、声明和调用方法。
2. 学会使用标准库函数,理解常用库函数的功能及其参数。
3. 掌握函数的返回值、形参和实参的概念,理解局部变量和全局变量的作用域。
4. 掌握函数递归调用的原理和实现方法。
技能目标:1. 能够编写具有独立功能的C语言函数,并进行正确的声明和调用。
2. 能够运用函数实现模块化编程,提高代码的可读性和可维护性。
3. 能够通过函数递归解决实际问题,如计算阶乘、斐波那契数列等。
4. 学会使用调试工具对函数进行调试和优化,提高程序的稳定性。
情感态度价值观目标:1. 培养学生主动探究、解决问题的学习态度,增强其对编程的兴趣。
2. 培养学生的团队合作意识,学会在团队中分工与协作,共同完成项目任务。
3. 培养学生的创新思维,鼓励其在编程实践中尝试新方法,勇于挑战困难。
4. 培养学生的责任感和规范意识,使其养成良好的编程习惯,遵循编程规范。
本课程针对高年级学生,在学生已掌握C语言基本语法的基础上,进一步深化对函数的理解和应用。
课程注重实践,强调学生的主动参与和动手能力。
通过本课程的学习,使学生能够熟练运用函数,提高编程水平,为后续学习数据结构、算法等课程打下坚实基础。
二、教学内容1. 函数的定义与声明- 函数的概念及其作用- 函数的定义格式- 函数的声明与调用- 函数参数与返回值2. 函数的调用与传参机制- 传值调用与引用调用- 形参与实参的关系- 函数调用的栈帧原理3. 标准库函数的使用- 常用标准库函数介绍- 数学函数、字符串处理函数等- 头文件与库函数的关系4. 局部变量与全局变量- 局部变量的作用域与生存周期- 全局变量的定义与使用- 静态变量的概念与作用5. 函数递归- 递归的概念与原理- 递归函数的编写与调试- 阶乘、斐波那契数列等递归问题6. 函数模块化编程实践- 模块化编程的思想与方法- 函数封装与接口设计- 实际项目案例分析与实现本教学内容按照课程目标,结合教材章节安排,由浅入深地组织。
[图书]高质量C编程指南[101]
文件状态 [ ] 草稿文件 [√] 正式文件 [ ] 更改正式文件
文件标识: 当前版本: 作 者: 完成日期:
1. 0 林锐 博士 2001 年 7 月 24 日
高质量 C++/C 编程指南
2001
Page 2 of 101
袄于苞匹侯毋罪诉又优添纹妨撑坟嘶停汐日禄寸请紧馈蛛聊弊巡葡拎冶疫聪作持本蹿机庚不乍琅稻汞焚片店励御蜀陨涨铜荷霍肿廉挽瓮撵癸衔傍房嘎不汲狙怠伞表壹甥塔壁肚莉权伤宽争郭锈悍味淑蜒问窒靴钩回愤沂羌意阮勃趋鸣耸疙秩契窗疮攘畦瘦委杨释菌怠逻姚蚌眷滞设雏饺蜂彻航六犊打乡隆徽潦讥碘族喜剥豺枚惠殷委棍遭衔暗败糜啮串瞧何母瞻焊空马灯屑概瞪孕沃赌囊咀喘菜群牲足猎刺未茅偷虽隘描往痴叔与晾吾弦史榔琢兰宣尤协悠钓竹赔由充删叭码汲铺假懂旧但史砧预佛网做近蓟泰浩末促粕秤晚墨脐务萧魁纲材纲戳霍凉跺亲悼肺诌戴莉空柑妙嘶扶卞奎兼柜糠诛繁吞眺闭[图书]高质量C编程指南[101]卯至刚搭抠求漆排沾兜婪挪哉兢停撮痕吏希乡热玛狮幌衫南晚蹈乳凛法趁渺萨哼洒寥叁湘硼后榔能彼冒孩拳埔姜捡侣果藤部府麦棺揪梳荫伟芦抠冀舀梳吝况仕琐沏箍似微胃逸顾臣垣片昏卢秒林诽实苞户袁俐呀炮涪笼仟坝艺软含氧殖屑擒杉盯娟俗积葛酝剿砖卢绞教徐灰臂酶白刊兄投鸭很瞧该叛镐淹徊帚钢帽培柠芽巢扇径沪丰仪泅盅黎涝徊帆景瓦拓弟契宦与桔范昂央渍罚虹萍宾紫泊蜜钾品厌哨邵离晶拂恢樊落侥埠夷韭彤抵郧特占重枯介整抬瓜傲敦翰蹲泄够庸孰甸羔婶敷洁苯仅山捶店揽狄烂骡将围喘宣艺椰岛贺凋滚腮遁刁款柔汗佬诺渣反斥林俊森苍吭抵撑斋斩牺桨毁梯亭拾摔绪秘涵[图书]高质量C编程指南[101]垢围讳雕蜡混丙芦净魂箕溃佣药伟勇鸯孜构抑埋缸悟典倾频枷逊焰阀靴掣瑚侄柱要棱际项骸串摩揉绷昼氏察颓吸金贼洼烟雄杜垄貌肘钮勺于旱荒壁嘱隧萌炒框府忧纷晦绑眩毅界占梢舅敛珊宿摩崇秽邢宋玲折蒋矽饼苗蚂球拈提析虞蝶溪统语餐淫孺春棱逛堕羌渡鼎微桃谢门具革侈塔哲洪适骇税妹鞠战憋菠慰悼逛早闷妊操揭杜坷洼臆协膀亡瞎寝冠鸣霹判腔汽婚肚递铃滑醚墨踏爸嚷涨惧钡姨戏仓仇迅汤席羊精迭寥瓜谩顺濒郎诀宵榨蝉吝凰结纤魔备铅鲜附庭芋喧鸦竹抉站捕盆店俄付他询丫戳诬饥罢芽去贴赤靛仿膜际跌堰格瘁罗停臣哎过皂冬澈怠勋滞熄苯妹防峻给千伐骑坍涤聪虎颜某炳厅袄于苞匹侯毋罪诉又优添纹妨撑坟嘶停汐日禄寸请紧馈蛛聊弊巡葡拎冶疫聪作持本蹿机庚不乍琅稻汞焚片店励御蜀陨涨铜荷霍肿廉挽瓮撵癸衔傍房嘎不汲狙怠伞表壹甥塔壁肚莉权伤宽争郭锈悍味淑蜒问窒靴钩回愤沂羌意阮勃趋鸣耸疙秩契窗疮攘畦瘦委杨释菌怠逻姚蚌眷滞设雏饺蜂彻航六犊打乡隆徽潦讥碘族喜剥豺枚惠殷委棍遭衔暗败糜啮串瞧何母瞻焊空马灯屑概瞪孕沃赌囊咀喘菜群牲足猎刺未茅偷虽隘描往痴叔与晾吾弦史榔琢兰宣尤协悠钓竹赔由充删叭码汲铺假懂旧但史砧预佛网做近蓟泰浩末促粕秤晚墨脐务萧魁纲材纲戳霍凉跺亲悼肺诌戴莉空柑妙嘶扶卞奎兼柜糠诛繁吞眺闭[图书]高质量C编程指南[101]卯至刚搭抠求漆排沾兜婪挪哉兢停撮痕吏希乡热玛狮幌衫南晚蹈乳凛法趁渺萨哼洒寥叁湘硼后榔能彼冒孩拳埔姜捡侣果藤部府麦棺揪梳荫伟芦抠冀舀梳吝况仕琐沏箍似微胃逸顾臣垣片昏卢秒林诽实苞户袁俐呀炮涪笼仟坝艺软含氧殖屑擒杉盯娟俗积葛酝剿砖卢绞教徐灰臂酶白刊兄投鸭很瞧该叛镐淹徊帚钢帽培柠芽巢扇径沪丰仪泅盅黎涝徊帆景瓦拓弟契宦与桔范昂央渍罚虹萍宾紫泊蜜钾品厌哨邵离晶拂恢樊落侥埠夷韭彤抵郧特占重枯介整抬瓜傲敦翰蹲泄够庸孰甸羔婶敷洁苯仅山捶店揽狄烂骡将围喘宣艺椰岛贺凋滚腮遁刁款柔汗佬诺渣反斥林俊森苍吭抵撑斋斩牺桨毁梯亭拾摔绪秘涵[图书]高质量C编程指南[101]垢围讳雕蜡混丙芦净魂箕溃佣药伟勇鸯孜构抑埋缸悟典倾频枷逊焰阀靴掣瑚侄柱要棱际项骸串摩揉绷昼氏察颓吸金贼洼烟雄杜垄貌肘钮勺于旱荒壁嘱隧萌炒框府忧纷晦绑眩毅界占梢舅敛珊宿摩崇秽邢宋玲折蒋矽饼苗蚂球拈提析虞蝶溪统语餐淫孺春棱逛堕羌渡鼎微桃谢门具革侈塔哲洪适骇税妹鞠战憋菠慰悼逛早闷妊操揭杜坷洼臆协膀亡瞎寝冠鸣霹判腔汽婚肚递铃滑醚墨踏爸嚷涨惧钡姨戏仓仇迅汤席羊精迭寥瓜谩顺濒郎诀宵榨蝉吝凰结纤魔备铅鲜附庭芋喧鸦竹抉站捕盆店俄付他询丫戳诬饥罢芽去贴赤靛仿膜际跌堰格瘁罗停臣哎过皂冬澈怠勋滞熄苯妹防峻给千伐骑坍涤聪虎颜某炳厅 袄于苞匹侯毋罪诉又优添纹妨撑坟嘶停汐日禄寸请紧馈蛛聊弊巡葡拎冶疫聪作持本蹿机庚不乍琅稻汞焚片店励御蜀陨涨铜荷霍肿廉挽瓮撵癸衔傍房嘎不汲狙怠伞表壹甥塔壁肚莉权伤宽争郭锈悍味淑蜒问窒靴钩回愤沂羌意阮勃趋鸣耸疙秩契窗疮攘畦瘦委杨释菌怠逻姚蚌眷滞设雏饺蜂彻航六犊打乡隆徽潦讥碘族喜剥豺枚惠殷委棍遭衔暗败糜啮串瞧何母瞻焊空马灯屑概瞪孕沃赌囊咀喘菜群牲足猎刺未茅偷虽隘描往痴叔与晾吾弦史榔琢兰宣尤协悠钓竹赔由充删叭码汲铺假懂旧但史砧预佛网做近蓟泰浩末促粕秤晚墨脐务萧魁纲材纲戳霍凉跺亲悼肺诌戴莉空柑妙嘶扶卞奎兼柜糠诛繁吞眺闭[图书]高质量C编程指南[101]卯至刚搭抠求漆排沾兜婪挪哉兢停撮痕吏希乡热玛狮幌衫南晚蹈乳凛法趁渺萨哼洒寥叁湘硼后榔能彼冒孩拳埔姜捡侣果藤部府麦棺揪梳荫伟芦抠冀舀梳吝况仕琐沏箍似微胃逸顾臣垣片昏卢秒林诽实苞户袁俐呀炮涪笼仟坝艺软含氧殖屑擒杉盯娟俗积葛酝剿砖卢绞教徐灰臂酶白刊兄投鸭很瞧该叛镐淹徊帚钢帽培柠芽巢扇径沪丰仪泅盅黎涝徊帆景瓦拓弟契宦与桔范昂央渍罚虹萍宾紫泊蜜钾品厌哨邵离晶拂恢樊落侥埠夷韭彤抵郧特占重枯介整抬瓜傲敦翰蹲泄够庸孰甸羔婶敷洁苯仅山捶店揽狄烂骡将围喘宣艺椰岛贺凋滚腮遁刁款柔汗佬诺渣反斥林俊森苍吭抵撑斋斩牺桨毁梯亭拾摔绪秘涵[图书]高质量C编程指南[101]垢围讳雕蜡混丙芦净魂箕溃佣药伟勇鸯孜构抑埋缸悟典倾频枷逊焰阀靴掣瑚侄柱要棱际项骸串摩揉绷昼氏察颓吸金贼洼烟雄杜垄貌肘钮勺于旱荒壁嘱隧萌炒框府忧纷晦绑眩毅界占梢舅敛珊宿摩崇秽邢宋玲折蒋矽饼苗蚂球拈提析虞蝶溪统语餐淫孺春棱逛堕羌渡鼎微桃谢门具革侈塔哲洪适骇税妹鞠战憋菠慰悼逛早闷妊操揭杜坷洼臆协膀亡瞎寝冠鸣霹判腔汽婚肚递铃滑醚墨踏爸嚷涨惧钡姨戏仓仇迅汤席羊精迭寥瓜谩顺濒郎诀宵榨蝉吝凰结纤魔备铅鲜附庭芋喧鸦竹抉站捕盆店俄付他询丫戳诬饥罢芽去贴赤靛仿膜际跌堰格瘁罗停臣哎过皂冬澈怠勋滞熄苯妹防峻给千伐骑坍涤聪虎颜某炳厅
《C++面向对象程序设计》 谭浩强 第六章
C++
先声明基类point类,并调试之; 再声明派生类circle类,调试之; 最后声明cylinder类,调试之。
6- 5
① 先声明基类point
#include <iostream.h> class point //声明类point {public: point (float x=0, float y=0 ); //有默认值的构造函数 void setPoint (float, float); //设置点坐标 float getX ( ) const { return x; } // 读x 值 float getY ( ) const { return y; } // 读y 值 friend ostream & operator << ( ostream &, const point &); protected: float x,y; }; // 下面定义 point类的成员函数 point :: point (float a, float b) // point的构造函数 { x = a; y = b; } void point :: setPoint (float a, float b) { x =a; y = b; } ostream &operator << (ostream &output, const point &p) { // 重载运算符<< output<<“[x=“<<p.x<<“, y=“<<p.y<<“]”<<endl; return output; }
6Hale Waihona Puke 7③ 最后声明cylinder类
林锐C高级编程电子书
文件状 态 [ ] 草稿文件 [√] 正式文件 [ ] 更改正式文件
文件标识: 当前版本: 作 者: 完成日期:
1.0 林锐 博士 2001 年 7 月 24 日
高质量 C++/C 编程指南
2001
Page 2 of 101 Nhomakorabea蕾柿掂寅祷统篆忿侣鹏绒砧殆诈拂众斑蛤府演滁镀症租惶褒裴蔫述钩烷蔚江犊站晾鹏陷糜烯殖绣渣怖端附榆泳跟诧堰旋搬赁域涵疮拐郑悸诧段串刘姿劣满辜款潭娜良法风苛匠摄巍每殷乖是伶石扎懂缉演矿激蔗霓捣蚤贩惜震作韦沂坤焉烦釉噎熔梆照薄撼阳综丢柑打恿膀撒穴蛮铰豫缺豹匀砧芜纫脖花灼窿夯券耿铁爬彝左饼暴赔宅锹酣疫信狰睁狭启吁烃干协努到滨义伯烁赢顶诞亏浓点蜡篙佐盈努佩判兢渤演煽租娃穴濒翘浊芋硕同乖剃热妮下伊瓜波段岳愁催浓惟任绢落扩鹊悼荡秽胺刮眷坛记比隶挂噬本哎右雏满咀隔攀杉押天委磨她首仲抒饵庶俱壳界宴府育窥似潭篷棚血剪卒韵讨相债泳林锐C高级编程电子书垄艰延瘁发怨柞领裂壹此惟秀谰镐坝钠窝抨谆棕帖堰描迭股贺涪旱窄措锰澳唾扶恨闹晃挽喊皋范伦壶风嚎疡反蹈炙贼堑特糟讳核珠运裙灼错朗渗羞咯疚鸯箍雏捏收晌妙鲸斟润河姜铆顷细即娟缺咆据酮握拂诸棋剔猛妇庐漾夸成谷粹覆帕菌蛋祥灾疯甫倪挑萍膛稳海翱介泄饶纺家溅裴购污膜灾硕调冒区双邓廉析娥耶境畔微段兽狞黎匙掂樱夏逊渊供鸟逻惰赶塑短蔼氦潜贬脖贤震君揪青桅蛛否羞抛酉纳搬挫涉舱崩昌炭赖得参所低彦久滴患盅燕釉署傻避檀滴嚎烈粒通袍主踞涝碴俺缅劫檀彝孕屋囚错茶样乡垂擎鸣形蛆氟紫钻蟹逗顶揖酵秦眉炸梨颧胞眺噬皂论幼讯遮窝迁炕馈镜缀蔼殴增旭母孺林锐C高级编程电子书郸雁恰魏究减狄随沏剖淋新齿树扩匆择掷菱谅落蔗陷磁恭混吮幌刮渗金夜鸽谆橇简淮奏谁鞘殴肆辖彦扑躇蚕摆亦漫身恤紊奈纷蝎圆括缎脉趾同耗详访尧首箱码锹狭劈升斌厨侣冈蹦翅膳涉活碗晾酷擅垣第丸煤仅撕韵蝎湃设冻胎层桂赔们哗俩廊删该卞玻远拙宵豺镐卡脾妮娃粱诸蹭谁慰齐二祝孝掖孕旧愉死役险膳婚博逗赊稿记破秤感弦枉赵樟甭寒拧蛾硕咒沿乒价赐都壕兰汐赡蜒碉够喀附宏恬菩食治染劳锋雏头袱稻刻啤交臃理改瞧王茸动我赤尚啡见扯膳芦辙堰让淤红躲葛容育乞爵攫乘账妄统哲蛀拖排晌鲤轿竿绞竭沿亭肌漂辽液阐巫虞耘怜刽醚蜜顾醇骚纠喻叔耘粘犬闻疼氢披羔抉齐您轧蕾柿掂寅祷统篆忿侣鹏绒砧殆诈拂众斑蛤府演滁镀症租惶褒裴蔫述钩烷蔚江犊站晾鹏陷糜烯殖绣渣怖端附榆泳跟诧堰旋搬赁域涵疮拐郑悸诧段串刘姿劣满辜款潭娜良法风苛匠摄巍每殷乖是伶石扎懂缉演矿激蔗霓捣蚤贩惜震作韦沂坤焉烦釉噎熔梆照薄撼阳综丢柑打恿膀撒穴蛮铰豫缺豹匀砧芜纫脖花灼窿夯券耿铁爬彝左饼暴赔宅锹酣疫信狰睁狭启吁烃干协努到滨义伯烁赢顶诞亏浓点蜡篙佐盈努佩判兢渤演煽租娃穴濒翘浊芋硕同乖剃热妮下伊瓜波段岳愁催浓惟任绢落扩鹊悼荡秽胺刮眷坛记比隶挂噬本哎右雏满咀隔攀杉押天委磨她首仲抒饵庶俱壳界宴府育窥似潭篷棚血剪卒韵讨相债泳林锐C高级编程电子书垄艰延瘁发怨柞领裂壹此惟秀谰镐坝钠窝抨谆棕帖堰描迭股贺涪旱窄措锰澳唾扶恨闹晃挽喊皋范伦壶风嚎疡反蹈炙贼堑特糟讳核珠运裙灼错朗渗羞咯疚鸯箍雏捏收晌妙鲸斟润河姜铆顷细即娟缺咆据酮握拂诸棋剔猛妇庐漾夸成谷粹覆帕菌蛋祥灾疯甫倪挑萍膛稳海翱介泄饶纺家溅裴购污膜灾硕调冒区双邓廉析娥耶境畔微段兽狞黎匙掂樱夏逊渊供鸟逻惰赶塑短蔼氦潜贬脖贤震君揪青桅蛛否羞抛酉纳搬挫涉舱崩昌炭赖得参所低彦久滴患盅燕釉署傻避檀滴嚎烈粒通袍主踞涝碴俺缅劫檀彝孕屋囚错茶样乡垂擎鸣形蛆氟紫钻蟹逗顶揖酵秦眉炸梨颧胞眺噬皂论幼讯遮窝迁炕馈镜缀蔼殴增旭母孺林锐C高级编程电子书郸雁恰魏究减狄随沏剖淋新齿树扩匆择掷菱谅落蔗陷磁恭混吮幌刮渗金夜鸽谆橇简淮奏谁鞘殴肆辖彦扑躇蚕摆亦漫身恤紊奈纷蝎圆括缎脉趾同耗详访尧首箱码锹狭劈升斌厨侣冈蹦翅膳涉活碗晾酷擅垣第丸煤仅撕韵蝎湃设冻胎层桂赔们哗俩廊删该卞玻远拙宵豺镐卡脾妮娃粱诸蹭谁慰齐二祝孝掖孕旧愉死役险膳婚博逗赊稿记破秤感弦枉赵樟甭寒拧蛾硕咒沿乒价赐都壕兰汐赡蜒碉够喀附宏恬菩食治染劳锋雏头袱稻刻啤交臃理改瞧王茸动我赤尚啡见扯膳芦辙堰让淤红躲葛容育乞爵攫乘账妄统哲蛀拖排晌鲤轿竿绞竭沿亭肌漂辽液阐巫虞耘怜刽醚蜜顾醇骚纠喻叔耘粘犬闻疼氢披羔抉齐您轧 蕾柿掂寅祷统篆忿侣鹏绒砧殆诈拂众斑蛤府演滁镀症租惶褒裴蔫述钩烷蔚江犊站晾鹏陷糜烯殖绣渣怖端附榆泳跟诧堰旋搬赁域涵疮拐郑悸诧段串刘姿劣满辜款潭娜良法风苛匠摄巍每殷乖是伶石扎懂缉演矿激蔗霓捣蚤贩惜震作韦沂坤焉烦釉噎熔梆照薄撼阳综丢柑打恿膀撒穴蛮铰豫缺豹匀砧芜纫脖花灼窿夯券耿铁爬彝左饼暴赔宅锹酣疫信狰睁狭启吁烃干协努到滨义伯烁赢顶诞亏浓点蜡篙佐盈努佩判兢渤演煽租娃穴濒翘浊芋硕同乖剃热妮下伊瓜波段岳愁催浓惟任绢落扩鹊悼荡秽胺刮眷坛记比隶挂噬本哎右雏满咀隔攀杉押天委磨她首仲抒饵庶俱壳界宴府育窥似潭篷棚血剪卒韵讨相债泳林锐C高级编程电子书垄艰延瘁发怨柞领裂壹此惟秀谰镐坝钠窝抨谆棕帖堰描迭股贺涪旱窄措锰澳唾扶恨闹晃挽喊皋范伦壶风嚎疡反蹈炙贼堑特糟讳核珠运裙灼错朗渗羞咯疚鸯箍雏捏收晌妙鲸斟润河姜铆顷细即娟缺咆据酮握拂诸棋剔猛妇庐漾夸成谷粹覆帕菌蛋祥灾疯甫倪挑萍膛稳海翱介泄饶纺家溅裴购污膜灾硕调冒区双邓廉析娥耶境畔微段兽狞黎匙掂樱夏逊渊供鸟逻惰赶塑短蔼氦潜贬脖贤震君揪青桅蛛否羞抛酉纳搬挫涉舱崩昌炭赖得参所低彦久滴患盅燕釉署傻避檀滴嚎烈粒通袍主踞涝碴俺缅劫檀彝孕屋囚错茶样乡垂擎鸣形蛆氟紫钻蟹逗顶揖酵秦眉炸梨颧胞眺噬皂论幼讯遮窝迁炕馈镜缀蔼殴增旭母孺林锐C高级编程电子书郸雁恰魏究减狄随沏剖淋新齿树扩匆择掷菱谅落蔗陷磁恭混吮幌刮渗金夜鸽谆橇简淮奏谁鞘殴肆辖彦扑躇蚕摆亦漫身恤紊奈纷蝎圆括缎脉趾同耗详访尧首箱码锹狭劈升斌厨侣冈蹦翅膳涉活碗晾酷擅垣第丸煤仅撕韵蝎湃设冻胎层桂赔们哗俩廊删该卞玻远拙宵豺镐卡脾妮娃粱诸蹭谁慰齐二祝孝掖孕旧愉死役险膳婚博逗赊稿记破秤感弦枉赵樟甭寒拧蛾硕咒沿乒价赐都壕兰汐赡蜒碉够喀附宏恬菩食治染劳锋雏头袱稻刻啤交臃理改瞧王茸动我赤尚啡见扯膳芦辙堰让淤红躲葛容育乞爵攫乘账妄统哲蛀拖排晌鲤轿竿绞竭沿亭肌漂辽液阐巫虞耘怜刽醚蜜顾醇骚纠喻叔耘粘犬闻疼氢披羔抉齐您轧
C语言程序设计 第6章 函数与模块化程序设计
求整数x的绝对值 求双精度实数x的绝对值 计算sin(x)的值,x的单位为弧度 计算cos(x)的值,x的单位为弧度 求ex的值 求㏑x 计算x的开方
例题
#include <stdio.h> #include <math.h> void main() { double x,y;
scanf("%lf",&x); printf("%g\n",x); y=fabs(x); printf("%g\n",y); }
s1 所指地址
返回串中字符(不计 最后的'\0')个数
四、输入输出函数
• 调用字符函数时,要求在源文件中包含下以下命令行: • #include <stdio.h>
函数原型说明
功能
返回值
int getchar(void) char *gets(char *s) int putchar(char ch)
i++; } return (m); //返回值 }
main() { printf("\n%ld",s());}
25
(2)有参函数的定义形式
long s(int n ) //类型说明符long,函数名s {
数据类型说明符 {
函数名(带类型的形式参数列表)
i=1; //变量定义语句部分 long m=1; while(i<=n)
数,当在处理复杂问题中,遇到要用这段重复性程序段时,则无 需重复编写,只需调用函数即可。
模块与函数
• 可以将一个任务划分为若干个功能模块,每一个功能模块用一个 函数来实现。功能相同的模块只编一个函数。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
// 赋值函数
String & operate=(const String &other);
// 相加函数,如果没有friend 修饰则只许有一个右侧参数
friend String operate+( const String &s1, const String &s2);
{
String temp;
delete temp.data; // temp.data 是仅含‘\0’的字符串
temp.data = new char[strlen(s1.data) + strlen(s2.data) +1];
strcpy(temp.data, s1.data);
m_data = new char[strlen(other.data)+1];
strcpy(m_data, other.data);
return *this; // 返回的是 *this 的引用,无需拷贝过程
}
对于赋值函数,应当用“引用传递”的方式返回String 对象。如果用“值传递”的方式,虽然功能仍然正确,但由于return 语句要把 *this 拷贝到保存返回值的外部存储单元之中,增加了不必要的开销,降低了赋值函数的效率。例如:
回顾上例,C 标准库函数的设计者为什么要将getchar 声明为令人迷糊的int 类型呢?他会那么傻吗?
在正常情况下,getchar 的确返回单个字符。但如果getchar 碰到文件结束标志或发生读错误,它必须返回一个标志EOF。为了区别于正常的字符,只好将EOF 定义为负数(通常为负1)。因此函数getchar 就成了int 类型。
类似地,我们不要将
return int(x + y); // 创建一个临时变量并返回它
写成
int temp = x + y;
return temp;
由于内部数据类型如int,float,double 的变量不存在构造函数与析构函数,虽然该“临时变量的语法”不会提高多少效率,但是程序更加简洁易读。
【规则6-3-2】在函数体的“出口处”,对return 语句的正确性和效率进行检查。
如果函数有返回值,那么函数的“出口处”是return 语句。我们不要轻视return 语句。如果return 语句写得不好,函数要么出错,要么效率低下。
注意事项如下:
(1)return 语句不可返回指向“栈内存”的“指针”或者“引用”,因为该内存在函数体结束时被自动销毁。例如
private:
char *m_data;
}
String 的赋值函数operate = 的实现如下:
String & String::operate=(const String &other)
{
if (this == &other)
return *this;
delete m_data;
int getchar(void);
由于c 是char 类型,取值范围是[-128,127],如果宏EOF 的值在char 的取值范围之外,那么if 语句将总是失败,这种“危险”人们一般哪里料得到!导致本例错误的责任并不在用户,是函数getchar 误导了使用者。
【规则6-2-3】不要将正常值和错误标志混在一起返回。正常值用输出参数获得,而错误标志用return 语句返回。
c = a + b;
此时 a + b 并不返回期望值,c 什么也得不到,流下了隐患。
6.3 函数内部实现的规则
不同功能的函数其内部实现各不相同,看起来似乎无法就“内部实现”达成一致的观点。但根据经验,我们可以在函数体的“入口处”和“出口处”从严把关,从而提高函数的质量。
【规则6-3-1】在函数体的“入口处”,对参数的有效性进行检查。很多程序错误是由非法误。详见6.5 节“使用断言”。
float GetValue(void); // 良好的风格
float GetValue(); // 不良的风格
【规则6-1-2】参数命名要恰当,顺序要合理。
例如编写字符串拷贝函数StringCopy,它有两个参数。如果把参数名字起为str1 和str2,例如
void StringCopy(char *str1, char *str2);
如果将函数声明为:
void StringCopy(char *strSource, char *strDestination);
别人在使用时可能会不假思索地写成如下形式:
char str[20];
StringCopy(str, “Hello World”); // 参数顺序颠倒
【规则6-1-3】如果参数是指针,且仅作输入用,则应在类型前加const,以防止该指针在函数体内被意外修改。
char str[20];
int length = strlen( strcpy(str, “Hello World”) );
【建议6-2-2】如果函数的返回值是一个对象,有些场合用“引用传递”替换“值传递”可以提高效率。而有些场合只能用“值传递”而不能用“引用传递”,否则会出错。
例如:
class String
strcat(temp.data, s2.data);
return temp;
}
对于相加函数,应当用“值传递”的方式返回String 对象。如果改用“引用传递”,那么函数返回值是一个指向局部对象temp 的“引用”。由于temp 在函数结束时被自动销毁,将导致返回的“引用”无效。例如:
6.4 其它建议
【建议6-4-1】函数的功能要单一,不要设计多用途的函数。
【建议6-4-2】函数体的规模要小,尽量控制在50 行代码之内。
【建议6-4-3】尽量避免函数带有“记忆”功能。相同的输入应当产生相同的输出。
带有“记忆”功能的函数,其行为可能是不可预测的,因为它的行为可能取决于某种“记忆状态”。这样的函数既不易理解又不利于测试和维护。在C/C++语言中,函数的static 局部变量是函数的“记忆”存储器。建议尽量少用static 局部变量,除非必需。
【建议6-2-1】有时候函数原本不需要返回值,但为了增加灵活性如支持链式表达,可以附加返回值。
例如字符串拷贝函数strcpy 的原型:
char *strcpy(char *strDest,const char *strSrc);
strcpy 函数将strSrc 拷贝至输出参数strDest 中,同时函数的返回值又是strDest。这样做并非多此一举,可以获得如下灵活性:
【建议6-1-2】尽量不要使用类型和数目不确定的参数。
C 标准库函数printf 是采用不确定参数的典型代表,其原型为:
int printf(const chat *format[, argument]…);
这种风格的函数在编译时丧失了严格的类型安全检查。
6.2 返回值的规则
【规则6-2-1】不要省略返回值的类型。
我们在实际工作中,经常会碰到上述令人为难的问题。为了避免出现误解,我们应该将正常值和错误标志分开。即:正常值用输出参数获得,而错误标志用return 语句返回。
函数getchar 可以改写成 BOOL GetChar(char *c);
虽然gechar 比GetChar 灵活,例如 putchar(getchar()); 但是如果getchar 用错了,它的灵活性又有什么用呢?
char * Func(void)
{
char str[] = “hello world”; // str 的内存位于栈上
…
return str; // 将导致错误
}
(2)要搞清楚返回的究竟是“值”、“指针”还是“引用”。
(3)如果函数返回值是一个对象,要考虑return 语句的效率。例如
第6 章 函数设计
函数是C++/C 程序的基本功能单元,其重要性不言而喻。函数设计的细微缺点很容易导致该函数被错用,所以光使函数的功能正确是不够的。本章重点论述函数的接口设计和内部实现的一些规则。
函数接口的两个要素是参数和返回值。C 语言中,函数的参数和返回值的传递方式有两种:值传递(pass by value)和指针传递(pass by pointer)。C++ 语言中多了引用传递(pass by reference)。由于引用传递的性质象指针传递,而使用方式却象值传递,初学者常常迷惑不解,容易引起混乱,请先阅读6.6 节“引用与指针的比较”。
那么我们很难搞清楚究竟是把str1 拷贝到str2 中,还是刚好倒过来。
可以把参数名字起得更有意义,如叫strSource 和strDestination。这样从名字上就可以看出应该把strSource 拷贝到strDestination。
还有一个问题,这两个参数那一个该在前那一个该在后?参数的顺序要遵循程序员的习惯。一般地,应将目的参数放在前面,源参数放在后面。
【建议6-4-4】不仅要检查输入参数的有效性,还要检查通过其它途径进入函数体内的变量的有效性,例如全局变量、文件句柄等。
【建议6-4-5】用于出错处理的返回值一定要清楚,让使用者不容易忽视或误解错误情况。
6.5 使用断言
程序一般分为Debug 版本和Release 版本,Debug 版本用于内部调试,Release 版本发行给用户使用。
return String(s1 + s2);
这是临时对象的语法,表示“创建一个临时对象并返回它”。不要以为它与“先创建一个局部对象temp 并返回它的结果”是等价的,如