《高质量C/C++编程》读书笔记三

简介: 《高质量C/C++编程》读书笔记三

前言

 这本书是林锐博士写的关于C/C++编程规范的一本书,我打算写下一系列读书笔记,当然我并不打算全盘接收这本书中的内容。

 良好的编程习惯,规范的编程风格可以提高代码的正确性、健壮性、可靠性、效率、易用性、可读性、可扩展性、可复用性、兼容性、可移植性。

 能够长期稳定地编写高质量程序的程序员称为编程老手;

 能够长期稳定地编写出高难度、高质量的程序员称为编程高手。

 写不出好的代码,只能说是自己内功修炼不到位,而不是用所谓真正的程序员如何如何做借口。


函数设计

 函数实现的功能要单一,不应该出现一个函数实现多个功能的情况;

 函数体的规模不能过于庞大。


参数的规则

 参数的书写要完整,不能只写参数的类型而不写参数的名字;

 参数名要恰当(要能够见名知意),顺序要合理(目的参数放前面,源参数放在后面);

 如果指针参数仅作输入使用,则应该在类型前加const,防止这个指针在函数体内部被意外修改;

 函数的参数不能够太多,应该尽量控制在5个以内。


返回值的规则

 不能省略返回值的类型,如果没有返回值,就使用void;

 函数名不能够与返回值的类型在语义上发生冲突;

 不要将正常值和错误标志混在一起返回。正常值用输出参数获得,而错误标志应该用return语句返回;

 要注意使用值传递和引用传递,虽然大多数时候引用传递的效率很高,但是并不是所有环境;

 用于出错处理的返回值应当十分清楚,让使用者不容易忽视或误解错误情况。


函数内部实现的规则

 我们应当在函数体的头部对参数进行有效性的检查,比如使用断言;

 在函数的“出口处”,我们应当对return语句的正确性和效率进行检查,这里我们需要理解return的返回机制。


断言的使用

 程序一般分为Debug版和Release版,Debug版是内部调试使用的,Release是发布给用户使用的。

 asser断言是一个宏,仅在Debug版本下起作用,它被使用来检测一些“不应该”发生的情况。如果assert的参数为假,那么程序就会终止掉,并且会提示是什么地方发生了错误。

 断言是用来捕捉不应该发生的非法情况的,而不是解决捕捉错误情况的;

 在函数的入口处,使用窜言检查参数的有效性(合法性)。


引用与指针的比较

 引用被创建的同时就必须被初始化(指针则可以在任何时候被初始化);

 不能有NULL引用,引用必须与合法的存储单元关联(指针则可以是NULL);

 一旦引用被初始化,就不能改变引用的关系(指针可以随时改变所指向的对象)。


内存管理

内存分配方式

 从静态存储区分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在;

 在栈上创建。执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中。效率高,但是分配的内存容量是有限的;

 从堆上分配,也称为动态内存分配。程序在运行的时候使用malloc和new申请任意大小的内存,成员自己负责在核实free或delete释放掉内存,动态内存的生存期由程序员决定,使用非常灵活,但是也最容易出问题。


常见的内存错误及其对策

 内存分配未成功,却使用了它。所以在使用前应该检查指针是否为NULL;

 内存分配成功,但是没有初始化就使用。我们应当建立初始化概念,记得赋初值;

 操作越界。内存的边界应该能够让我们直观的看见,注意循环的次数;

 忘记释放内存,导致内存泄露。内存的申请与释放应该配对使用。


目录
相关文章
|
10天前
|
编译器 C++ 开发者
C++一分钟之-C++20新特性:模块化编程
【6月更文挑战第27天】C++20引入模块化编程,缓解`#include`带来的编译时间长和头文件管理难题。模块由接口(`.cppm`)和实现(`.cpp`)组成,使用`import`导入。常见问题包括兼容性、设计不当、暴露私有细节和编译器支持。避免这些问题需分阶段迁移、合理设计、明确接口和关注编译器更新。示例展示了模块定义和使用,提升代码组织和维护性。随着编译器支持加强,模块化将成为C++标准的关键特性。
27 3
|
11天前
|
存储 C++
【C++航海王:追寻罗杰的编程之路】一篇文章带你了解二叉搜索树
【C++航海王:追寻罗杰的编程之路】一篇文章带你了解二叉搜索树
11 1
|
11天前
|
算法 安全 编译器
【C++航海王:追寻罗杰的编程之路】C++11(四)
【C++航海王:追寻罗杰的编程之路】C++11(四)
16 0
|
11天前
|
存储 自然语言处理 C++
【C++航海王:追寻罗杰的编程之路】set|map|multiset|multimap简单介绍
【C++航海王:追寻罗杰的编程之路】set|map|multiset|multimap简单介绍
14 0
【C++航海王:追寻罗杰的编程之路】set|map|multiset|multimap简单介绍
|
11天前
|
存储 安全 程序员
【C++航海王:追寻罗杰的编程之路】C++11(一)
【C++航海王:追寻罗杰的编程之路】C++11(一)
13 0
【C++航海王:追寻罗杰的编程之路】C++11(一)
|
11天前
|
设计模式 编译器 C++
【C++航海王:追寻罗杰的编程之路】特殊类的设计方式你知道哪些?
【C++航海王:追寻罗杰的编程之路】特殊类的设计方式你知道哪些?
10 0
|
11天前
|
编译器 C++
【C++航海王:追寻罗杰的编程之路】多态你了解多少?
【C++航海王:追寻罗杰的编程之路】多态你了解多少?
9 0
|
11天前
|
编译器 C++ 容器
【C++航海王:追寻罗杰的编程之路】C++11(三)
【C++航海王:追寻罗杰的编程之路】C++11(三)
6 0
|
11天前
|
存储 编译器 C++
【C++航海王:追寻罗杰的编程之路】C++11(二)
【C++航海王:追寻罗杰的编程之路】C++11(二)
11 0
|
11天前
|
存储 Java 程序员
【C++航海王:追寻罗杰的编程之路】异常——错误处理方式之一
【C++航海王:追寻罗杰的编程之路】异常——错误处理方式之一
12 0