高质量的C++编程指南总结(二):常量、函数设计

第5章 常量

使用#define和const来定义常量,若不使用常量程序的可读性会变差,如忘记某些数字或者字符串要表达的意思,程序的很多地方需要输入同样的数字或字符串,难保不发生书写错误,若要修改数字或字符串,需要在很多地方修改,麻烦且易出错。

const和#define:const常量具有数据类型,而宏常量没有,没有类型安全检查,且字符替换可能会产生意想不到的错误;有些调试工具可以对const常量进行调试,但不能对宏常量进行调试。尽量使用const常量代替宏常量。

需要对外公开的常量放在头文件中,不需要的放在定义文件中;若一个常量与其它常量关系密切,应在定义中包含这种关系。

类中的常量:

const数据成员只在某个对象生存周期内是常量,而对于整个类而言是可变的,因为类可以创建多个对象,不同对象其const数据成员的值可以不同。不能在类声明中直接初始化const数据成员,因为类的对象未被创建,其初始化只能在类构造函数的初始化表中进行;若需要在类中建立恒定的常量,应该使用枚举常量来实现。但缺点是隐含的数据类型是整数,最大值有限,且不能表示浮点数。


第6章 函数设计

函数接口的两个元素是参数和返回值,参数和返回值的传递方式有三种:值传递、指针传递和引用传递。

参数的命名要恰当,顺序要合理,一般地,应将目的参数放前面,源参数放在后面;若参数是指针且只作输入用,则应在类型前加const,以防止该指针在函数体内被意外修改;若输入参数以值传递的方式传递对象,则宜改用“const &”方式来传递,这样可省去临时对象的构造和析构过程;尽量不要使用类型和数目不确定的参数。

函数的名字和返回值类型在语义上不要冲突,不要正常值和错误标志混在一起返回,正常值用输出参数获得,错误标志用return语句返回;偶尔可以给原本不需要返回值的函数附加返回值,以增加灵活性如支持链式表达;若返回值是一个对象,有些场合用引用传递替换值传递可以提高效率,而有些场合则不能。

内部实现规则:

在函数体的入口处,应当对参数的有效性进行检查,在出口处对return语句的正确性和有效性进行验证。

return语句不能返回指向“栈内存”的“指针”或者“引用”,因为该内存在函数体结束时会被自动销毁;要清楚返回的究竟是“值”、“指针”还是“引用”;若返回的是一个对象,则要考虑return语句的效率,如return String(s1+s2),表示“创建一个临时对象并返回它”,它与“先创建一个局部对象并返回它的结构”是不一样的,前者直接将临时对象创建并初始化在外部存储单元中,而后者是先创建一个对象并完成初始化,再用拷贝构造函数拷贝到保存返回值的外部存储单元中,最后在函数结束时调用析构函数销毁,多了拷贝和析构的花费。

函数的功能要单一,不要设计多用途的函数,规模要小,尽量不要使函数带有“记忆”,如使用static局部变量;不仅检查输入参数的有效性,对于进入函数的其它变量,如全局变量等也要检查有效性。


合理使用assert确定错误的原因。

引用与指针:

引用相当于变量的别名,就是变量本身;

引用在被创建时必须完成初始化,而指针在任何时候都可以进行初始化;

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

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

引用的主要功能在于传递函数的参数和返回值,引用能做的工作指针也能做,但指针可以毫无约束的操作内存,风险较大,用适当的工具做恰如其分的工作。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值