前言
这本书是林锐博士写的关于C/C++编程规范的一本书,我打算写下一系列读书笔记,当然我并不打算全盘接收这本书中的内容。
良好的编程习惯,规范的编程风格可以提高代码的正确性、健壮性、可靠性、效率、易用性、可读性、可扩展性、可复用性、兼容性、可移植性。
能够长期稳定地编写高质量程序的程序员称为编程老手;
能够长期稳定地编写出高难度、高质量的程序员称为编程高手。
写不出好的代码,只能说是自己内功修炼不到位,而不是用所谓真正的程序员如何如何做借口。
函数设计
函数实现的功能要单一,不应该出现一个函数实现多个功能的情况;
函数体的规模不能过于庞大。
参数的规则
参数的书写要完整,不能只写参数的类型而不写参数的名字;
参数名要恰当(要能够见名知意),顺序要合理(目的参数放前面,源参数放在后面);
如果指针参数仅作输入使用,则应该在类型前加const,防止这个指针在函数体内部被意外修改;
函数的参数不能够太多,应该尽量控制在5个以内。
返回值的规则
不能省略返回值的类型,如果没有返回值,就使用void;
函数名不能够与返回值的类型在语义上发生冲突;
不要将正常值和错误标志混在一起返回。正常值用输出参数获得,而错误标志应该用return语句返回;
要注意使用值传递和引用传递,虽然大多数时候引用传递的效率很高,但是并不是所有环境;
用于出错处理的返回值应当十分清楚,让使用者不容易忽视或误解错误情况。
函数内部实现的规则
我们应当在函数体的头部对参数进行有效性的检查,比如使用断言;
在函数的“出口处”,我们应当对return语句的正确性和效率进行检查,这里我们需要理解return的返回机制。
断言的使用
程序一般分为Debug版和Release版,Debug版是内部调试使用的,Release是发布给用户使用的。
asser断言是一个宏,仅在Debug版本下起作用,它被使用来检测一些“不应该”发生的情况。如果assert的参数为假,那么程序就会终止掉,并且会提示是什么地方发生了错误。
断言是用来捕捉不应该发生的非法情况的,而不是解决捕捉错误情况的;
在函数的入口处,使用窜言检查参数的有效性(合法性)。
引用与指针的比较
引用被创建的同时就必须被初始化(指针则可以在任何时候被初始化);
不能有NULL引用,引用必须与合法的存储单元关联(指针则可以是NULL);
一旦引用被初始化,就不能改变引用的关系(指针可以随时改变所指向的对象)。
内存管理
内存分配方式
从静态存储区分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在;
在栈上创建。执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中。效率高,但是分配的内存容量是有限的;
从堆上分配,也称为动态内存分配。程序在运行的时候使用malloc和new申请任意大小的内存,成员自己负责在核实free或delete释放掉内存,动态内存的生存期由程序员决定,使用非常灵活,但是也最容易出问题。
常见的内存错误及其对策
内存分配未成功,却使用了它。所以在使用前应该检查指针是否为NULL;
内存分配成功,但是没有初始化就使用。我们应当建立初始化概念,记得赋初值;
操作越界。内存的边界应该能够让我们直观的看见,注意循环的次数;
忘记释放内存,导致内存泄露。内存的申请与释放应该配对使用。