Effective C++ 学习笔记 第五章:实现

第一章见 Effective C++ 学习笔记 第一章:让自己习惯 C++
第二章见 Effective C++ 学习笔记 第二章:构造、析构、赋值运算
第三章见 Effective C++ 学习笔记 第三章:资源管理
第四章见 Effective C++ 学习笔记 第四章:设计与声明
第五章见 Effective C++ 学习笔记 第五章:实现
第六章见 Effective C++ 学习笔记 第六章:继承与面向对象设计
第七章见 Effective C++ 学习笔记 第七章:模板与泛型编程
第八章见 Effective C++ 学习笔记 第八章:定制 new 和 delete
第九章见 Effective C++ 学习笔记 第九章:杂项讨论

条款 26:尽可能延后变量定义式的出现时间

Postpone variable definitions as long as possible.

尽可能的在需要使用变量(或指类型对象)时,再定义对象,尽可能避免无用的构造和析构操作。

如果构造对象之后,紧接着需要对对象进行赋值操作,更好的设计是直接调用有参数的构造函数直接完成。如:

std::string enc;  // 调用默认构造函数
enc = pas;        // 再调用赋值运算符重载函数
// 以上不如直接替换为以下:
std::string enc(pas);  // 调用 copy 构造函数

如果一个对象是循环内变量,若满足以下两个条件:

  1. 能确定构造、析构操作比赋值操作代价低;
  2. 需要高度性能敏感的代码;

则将循环内变量外提,在循环之前定义;否则,建议在循环内定义对象。
原因是,前者的代价是:1 次构造 + 1 次析构 + n 次赋值;后者的代价是:n 次构造 + n 次赋值。(n 为循环次数)
建议使用后者的原因是,尽可能的控制对象的作用域。

总结

  • 尽可能延后变量定义式的出现。这样做可增加程序的清晰度并改善程序效率。

条款 27:尽量少做转型动作

Minimize casting.

传统的 C 转型方式有两种:

(T)expression    // 将 expression 转型成 T 类型
T(expression)    // 同理,函数样式转型

C++ 中提供了新型转型:

const_cast<T> (expression)    // const 属性去除转型,C 转型没有这个功能
dynamic_cast<T> (expression)  // 安全继承向下转型(base 到 derive),谨慎用
reinterpret_cast<T> (expression)   // 低级转型,比如将指针类型转型成整形,不常用
static_cast<T> (expression)  // 比较常用,强制转换,但不支持 const_cast 的效果

建议使用新型转型,原因:

  1. 容易辨识,也容易自动化查找(如 grep);
  2. 功能效果细化,容易控制,不易出错;

谨慎使用转型动作,尽可能用其他设计来替代转型动作。
dynamic_cast 转型可能会非常慢,尽量避免使用,可使用多态的方案替代。
或者将转型动作藏起来。

总结

  • 如果可以,尽量避免转型,特别是在注重效率的代码中避免 dynamic_cast。如果需要转型,试着使用其他无需转型的替代方案。
  • 如果必须要用转型,试着将其藏在函数内部,避免客户在他们自己的代码中去使用转型。
  • 宁可使用 C++ 风格的新式转型,不要使用旧式转型。

条款 28:避免返回handles 指向对象内部成分

Avoid returnning “handles” to obje

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值