IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 高质量程序设计指南C++学习总结二 -> 正文阅读

[C++知识库]高质量程序设计指南C++学习总结二

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++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-05-21 18:44:48  更:2022-05-21 18:46:44 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 18:59:26-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码