1、不要将正常值和错误标志混在一起返回。建议正常值用输出参数获得,而错误标志用return语句返回。
2、函数名字与返回值类型在语义上不可冲突。违反这条规则的典型代表是C标准库函数getchar();
3、
4、在函数体的“入口处”,对参数的有效性进行检查。很多程序的错误是由非法参数引起的,我们应该充分理解并正确使用“断言”(assert)来防止此类错误
5、 尽量避免函数带有“记忆”功能。相同的输入应当产生相同的输出。带有“记忆”功能的函数,其行为可能是不可预测的,因为它的行为可能取决于某种“记忆状态”。这样的函数既不易于理解又不利于测试和维护。在C++/C语言中,函数的static局部变量是函数的“记忆”存储器。建议尽量少用static局部变量,除非必需,例如,static局部变量可以实现

6、当局部变量与某一个全局变量同名时,在函数内部将遮蔽该全局变量。此时在函数内部我们可以通过一元作用域解析运算符(::)来引用全局变量,例如,::g_iCount++。
7、
8、数除了能够嵌套调用外,还可以调用自己,这样的函数就是递归函数。递归函数的概念来源于数学领域函数的递归定义。常见的例子如乘幂xn、n!、等差等比数列、斐波那契数列等;递归函数是通过解决基本问题进而解决复杂问题的。
9、函数堆栈是自动增长的,理论上只要内存足够,它就会按需增长,直到达到最大堆栈限制为止
10、由于递归使用了函数的反复调用并占用了大量堆栈空间,所以其运行时的开销非常大
11、断言(assert)的语义如下:如果表达式的值为0(假),则输出错误消息并终止程序的执行(一般还会出现提示对话框,说明在什么地方引发了assert);如果表达式为真,则不进行任何操作。
12、C++/C的宏assert(expression)就是这样的断言,当表达式为假时,调用库函数abort() 终止程序。
13、程序员可以把assert看成一个在任何系统状态下都可以安全使用的无害测试手段。所以不要把程序中的assert语句删除。
14、要注意assert语句仅仅在Debug版本中才有效,而在Release版本中无效;
15、const只能修饰输入参数
16、如果输入参数采用“值传递”,由于函数将自动用实参的拷贝初始化形参,因此即使在函数内部修改了该参数,改变的也只是堆栈上的拷贝而不是实参,所以一般认为不需要用const修饰。
17、
18、字符数组就是元素为字符变量的数组,而字符串则是以’\0’(ASCII码值为0x00)为结束字符的字符数组。可见,字符数组并不一定就是字符串。必须用一个字符来标记字符串的结束,这就是’\0’的来历。
19、
20、不要用“==”、“>=”、“!=”符号直接比较两个字符串,字符串的比较应该使用strcmp、strncmp等库函数
21、某些字符串函数并不会自动在目标字符串结尾追加’\0’,如strncpy和strncat,除非你指定的n值比源串的长度大1,strcpy和strcat会把源串的结束符一并复制到目标串中。
22、在源代码层面,函数名就代表函数的首地址
23、连接器只能把这个通过函数指针的调用推迟到运行时再绑定(称为运行时连接)。
24、类的静态成员函数不依赖于类的对象而存在,也不依赖于类的对象而调用,因此它和普通的全局函数没什么两样,只是其作用域变成了类作用域。
25、类的成员函数有4种类型:inline、virtual、static、normal。inline函数在运行时会展开,虽然语言允许取其地址,但是没有太大意义。virtual成员函数的地址指的是其在vtable中的位置;static成员函数的地址和普通全局函数的地址没有任何区别;普通成员函数的地址和一般函数的地址也没有区别,就是函数代码在内存中的真实地址,但是由于它的调用要绑定到一个实实在在的对象上,因此无论是其函数指针的声明方式还是其地址的获取方法都比较特别。
26、任何成员函数的代码体都是独立于类的对象而存在的,只是非静态成员函数在调用的时候需要与具体的对象建立绑定关系而已(即this指针)
27、因此取虚函数的地址将得到该虚函数实现体在vtable中的索引号。要想得到虚函数实现体的真实地址,还需要首先从对象入手,找到vptr的位置,进而找到vtable的所在,然后根据函数指针的大小和虚函数的索引,取出虚函数的真实地址。
28、
29、引用一旦被初始化为指向一个对象,它就不能被改变为对另一个对象的引用
30、引用的创建和销毁并不会调用类的拷贝构造函数和析构函数。
31、引用的主要用途是修饰函数的形参和返回值。C++语言中,函数的参数和返回值的传递方式有三种:值传递、指针传递和引用传递。引用既具有指针的效率,又具有变量使用的方便性和直观性。
32、“用适当的工具做恰如其分的工作”。引用体现了最小特权原则,即给予程序元素足以完成其功能的最小权限。
33、如果的确只需要借用一下某个对象的“别名”,那么就用“引用”,而不要用“指针”,以免发生意外。比如说,某人需要一份证明,本来在文件上盖上公章就行了,但如果把取公章的钥匙交给他,那么他就获得了不该有的权利。
34、语言本身的这种能力使我们能够定义非常复杂的数据结构,如树(tree)、链表(list)和映射(map)等
35、在C++语言中,如果不特别指明,struct成员的默认访问限定符为public,而class成员的默认访问限定符为private。
36、在C++程序中,只要你明确地声明每一个成员的访问权限,那么完全可以用struct取代class,也完全可以用class取代struct

37、构造类型虽然可以嵌套定义,但是对于嵌套定义的类型,其对象不一定存在包含关系,存在包含关系的对象类型也不一定是嵌套定义的。例如,上例中的_Name类型完全可以挪到Student定义的外面某处,而它们的对象之间的包含关系不会改变。当一个类型A只会在另一个类型B中被使用的时候,就可以把A定义在B的定义体内,这样可以减少暴露在外面的用户自定义类型的个数。
38、利用对象之间的引用关系,我们就可以实现链表、树、队列等复杂的数据结构,或者实现一些复杂的对象管理,比如对象之间的索引和定位。
39、文件操作属于一种I/O操作,I/O操作并不是C++/C语言的组成部分,它是通过标准的I/O函数库来实现的。
40、当我们打开一个文件的时候,操作系统就建立一个流对象并与该文件关联。操作系统维护了一个保存当前系统中所有打开文件的文件控制块(FCB)的数组,并利用每一个FCB来管理对每一个文件的操作,数组的上限就是操作系统允许你同时打开的文件个数的上限。
41、然后调用库函数fopen()。fopen()动态创建一个FILE结构对象并分配一个文件句柄,从磁盘文件中读入FCB结构并填入FCB数组中,然后返回这个FILE结构的地址。此后你就可以拿着这个地址调用文件操作库函数来完成特定的任务。最后调用fclose()函数销毁动态创建的FILE结构对象,同时释放文件句柄并刷新缓冲区等,因为其他应用程序有可能也要使用这些资源。
42、C++实现了面向对象的I/O系统,不再让用户直接使用“文件指针”这种原始的设施,而是把任何文件看作一个对象,对该对象的操作就是在对一个文件进行操作,同时允许用户为自定义数据类型定制I/O操作,这正是C++扩展性的表现。
43、虽然在C++程序中可以混用C的I/O操作方式和C++的I/O操作方式,但还是应该尽量使用后者,因为它是类型安全的。如果使用C的I/O操作方式,即使你的格式控制字符串与输出数据类型完全不匹配,编译器也不会帮你检查出来(因为它们是字符串常量),因此它是类型不安全的。
44、
45、为了避免同一个编译单元包含同一个头文件的内容超过一次(这会导致类型重复定义错),我们需要在头文件中使用内部包含卫哨。内部包含卫哨实际上是使用预处理器的一种标志宏。有了内部包含卫哨,我们就可以放心地在同一个编译单元及其包含的头文件中多次包含同一个头文件而不会造成重复包含
46、无论是在头文件中还是源文件中,在文件开始部分包含其他的头文件时需要遵循一定的顺序。如果包含顺序不当,有可能出现包含顺序依赖问题,甚至引起编译时错误。推荐的顺序如下:在头文件中:(1)包含当前工程中所需要的自定义头文件(顺序自定)。(2)包含第三方程序库的头文件。(3)包含标准头文件。在源文件中:(1)包含该源文件对应的头文件(如果存在)。(2)包含当前工程中所需要的自定义头文件。(3)包含第三方程序库的头文件。(4)包含标准头文件。
47、程序里使用双引号括起来的字符串中即使出现了与宏同名的子串,预处理过程也不进行替换。
48、宏名采用大写字符组成的单词或其缩写序列,并在各单词之间使用“”分隔。
49、不要使用宏来定义新类型名,应该使用typedef,否则容易造成错误。
50、
51、
52、(1)Include目录存放应用程序的头文件(.h),还可以再细分子目录。(2)Source目录存放应用程序的源文件(.c或 .cpp),还可以再细分子目录。(3)Shared目录存放一些共享的文件。(4)Resource目录存放应用程序所用的各种资源文件,包括图片、视频、音频、图标、光标、对话框等,还可以再细分子目录。(5)Debug目录存放应用程序调试版本生成的中间文件。(6)Release目录存放应用程序发行版本生成的中间文件。(7)Bin目录存放程序员自己创建的lib文件和dll文件。
53、C++/C程序的头文件以“.h”为后缀,C程序的源文件以“.c”为后缀,C++程序的源文件通常以“.cpp”为后缀(也有一些系统以“.cc”或“.cxx”为后缀)。
54、
55、
56、(1)ADT/UDT定义之间要留空行。ADT内部的各个访问段(public、private等)之间要留空行;每一段内按照相关性分组的,建议在各组之间留空行,没有明显相关性的不需要分组。(2)函数定义之间要留空行。在函数体内,完整的控制结构及单独的语句块之间要分别留出空行,它们与其他段落之间也要留出空行以示区分;逻辑上密切相关的语句序列之间不要留空行(例如,初始化数据成员的一系列语句);最后一条return语句前要留空行,除非该函数只有这一条语句;控制结构、语句块、条件编译块等遵循同样的规则。(3)注释行或注释块与被它们注释的程序元素之间不要留空行。
57、在软件领域,比较著名的命名规则当推Microsoft公司的“匈牙利”命名法,该命名规则的中心思想是“在标识符中加入能够表明其类型和作用域属性的前缀,以增进人们对标识符的理解”。所有的字符变量均以ch为前缀,若是指针变量则加前缀p。如果一个变量由ppch开头,则表明它是指向字符指针的指针。
58、标识符的名字应当直观且可以拼读,可望文知义,不必进行“解码”。
59、标识符的长度应当符合“min-length & max-information”原则。有时候标识符采用的英文单词太长,几个单词组合后会更长,此时应该采用一些通用而合理的缩写或者应用领域专业术语的缩写。通常这些缩写会在编程规范中给出,可作为参考。
60、变量应当使用“名词”或者“形容词+名词”的格式来命名。
61、全局函数的名字应当使用“动词”或者“动词+名词”(动宾词组)。类的成员函数应当只使用“动词”,被省略掉的名词就是对象本身。
62、用正确的反义词组命名具有相反意义的变量或相反动作的函数等。
63、尽量避免名字中出现数字编号,如value1、value2等,除非逻辑上的确需要如此。这是为了防止程序员偷懒,不肯动脑筋而用无意义的名字(因为用数字编号最省事),就像一般没有人会给子女起名叫张三或李四一样。
64、类型名和函数名均以大写字母开头的单词组合而成; 变量名和参数名采用第一个单词首字母小写而后面的单词首字母大写的单词组合。
65、 符号常量和宏名用全大写的单词组合而成,并在单词之间用单下画线分隔,注意首尾最好不要使用下画线。给静态变量加前缀s
(表示static)。如果不得已需要全局变量,这时全局变量加前缀g_(表示global)。 类的数据成员加前缀m_(表示member),这样可以避免数据成员与成员函数的参数同名。为了防止某一软件库中的一些标识符和其他软件库中的冲突,可以统一为各种标识符加上能反映软件性质的前缀。

高质量程序设计指南C++学习总结二相关推荐

  1. 高质量程序设计指南:C++/C语言

    <高质量程序设计指南:C++/C语言> 基本信息 作者: 林锐 韩永泉 [作译者介绍] 出版社:电子工业出版社 ISBN:9787121186172 上架时间:2012-10-24 出版日 ...

  2. 高质量程序设计指南C/C++阅读笔记

    阅读书籍:<高质量程序设计指南C/C++语言>林锐.韩勇泉著 说明: 本文档为阅读笔记,要求有一定的C/C++基础,属于提高篇 一.软件质量基本概念 功能属性: 1.正确性Correcte ...

  3. 【转贴】对《高质量程序设计指南--C++/C第二版》的探讨

    <高质量程序设计指南--C++/C(第二版)>的读书心得              作者:fang_rk     写这篇文章是出于一个偶尔的原因:读计算机系的女友即将升入研究生三年级,她说 ...

  4. 《高质量程序设计指南——C/C++语言》之开篇记

    <高质量程序设计指南--C/C++语言>是林锐博士和韩永泉先生撰写的著作,记得刚毕业那会读过了.应该说,这本书是对学校教科书的一个很好补充和提高.关于C/C++的经典书籍,国外已经有很多很 ...

  5. C语言书籍阅读-读书笔记--高质量程序设计指南》--C/C++,林锐

    最近闲下来想找机会参加一些编程比赛锻炼锻炼,可没有一个相关网站可以搜集这些信息,因而自己记录下来: 百度之星,http://star.baidu.com/index/developer.时间07.25 ...

  6. 《高质量程序设计指南——C++/C》第三版勘误

    <高质量程序设计指南--C++/C>第三版勘误 1.Page IX:1.5 "关于软件开发..."存在印刷问题: 2.Page 7:倒数第13行,"啰里啰唆& ...

  7. 《高质量程序设计指南——C/C++语言》第1章 高质量软件开发之道

    第1章 高质量软件开发之道 本书的第1章之高质量软件开发之道,作者用大量的篇幅介绍了"软件质量"的基本概念,解释了软件质量的十大属性.这十大质量属性又分为功能性和非功能性两类,功能 ...

  8. 高质量程序设计指南附录试题

    附录B :C++/C试题 本试题仅用于考查C++/C程序员的基本编程技能.内容限于C++/C常用语法,不涉及数据结构.算法以及深奥的语法.考试成绩能反映出考生的编程质量以及对C++/C的理解程度,但不 ...

  9. C++ 高质量程序设计指南读书笔记

    第四章 入门 1,全局变量的初始化不要依赖另一个全局变量.因为无法判断顺序. 2,每一个源代码文件就是一个最小的编译单元,每一个编译单元都能独立编译而不需要知道其他编译单元的存在及其编译结果.好处:公 ...

最新文章

  1. Android深度探索(卷1)HAL与驱动开发第五章总结
  2. AI用50个三角形画出抽象版蒙娜丽莎,有股后现代的感觉了 | 谷歌大脑出品
  3. 计算机音乐数字乐谱核爆神曲,原神乐谱核爆神曲
  4. struts2:JSON在struts中的应用(JSP页面中将对象转换为JSON字符串提交、JSP页面中获取后台Response返回的JSON对象)...
  5. Java去除字符中的空格(trim)
  6. 学习单片机c语言必备的两个软件,单片机C语言应用100例(第2版)
  7. 个人中心html界面设计,APP个人中心页面设计
  8. 英特尔固态硬盘测试软件,英特尔固态硬盘工具(Intel SSD Datacenter Tool)
  9. 服务器开机黑屏无法进入系统,电脑黑屏无法进入系统怎么办?
  10. MacBook上更新hosts文件并使其立刻生效
  11. 云计算学习网站都有哪些?学习云计算的方法
  12. 你的微信版本过低,无法正常使用此小程序,请更新微信到最新版本。
  13. 抖音短视频运营借势热点:有哪些热点渠道,有哪些热点改编的套路。
  14. Joining_thread简单实现
  15. 什么是条码,条码技术的应用,主要有哪些优势?
  16. 点击图片实现大图预览
  17. 重装系统当识别不到硬盘的解决办法
  18. 【推荐】编程语言学习网站
  19. 光纤光栅matlab,基于PSO算法的光纤光栅参数重构(附Matlab源程序)
  20. 客户关系管理软件是什么?企业为什么需要客户关系管理软件?

热门文章

  1. 码元携带多少比特信息?波特率和比特率的关系?
  2. PyCharm 快速批量注释及取消注释
  3. set集合关系及特点
  4. 个人日记-《疯狂的原始人2》动漫电影观后感-20201130
  5. html5播放加速,html5倍速播放插件
  6. Python CGI编程详细步骤,和说说我踩的坑!!
  7. 第九天 03-破解linux密码
  8. 栈(Stack)的应用—试探回溯法:八皇后问题、迷宫寻径
  9. idea右侧没有maven,main方法无启动图标解决方法
  10. 笔记本触摸板没反应怎么回事?笔记本触控板失灵解决办法