目录
条款25 Consider support for a non-throwing swap
条款26 Postpone variable definitions as long as possible
条款25 Consider support for a non-throwing swap
考虑写一个不抛出异常的swap函数
这是标准库中的swap函数
namespace std{
template<Typename T>
void swap(T& a,T& b){
T temp(a);
a = b;
b = temp;
}
}
这对于一些“pimpl”设计没有必要(pimpl,指pointer to implementation,使用指针实现)
基于此,我们可以制作一些特化模板的swap函数
如果你自己提供了一个member 函数swap,需要再提供一个non-member swap函数调用前者。
对于classes,可以特化std::swap,但是template classes不能特化std::swap。
不能重载std::swap,只能特化
条款26 Postpone variable definitions as long as possible
尽量延后变量的定义式
尽量再需要使用变量之前才去定义变量,如果在之前定义可能会用不上,但是仍然要承受其构造和析构的成本
尽可能跳过无意义的default构造过程,如果有可能,直接使用copy构造或者赋值构造等。
条款27 Minimize casting
尽量少转型
C++的四种新式转型
const_cast —— 对象的常量性转除
把const转变为non-const
dynamic_cast —— 安全向下转型
决定某对象是否属于某继承体系中的某个对象
reinterpret_cast —— 低级转型
意图执行低级转型,实际取决于编译器
static_cast —— 强迫隐式转换
例如non-const转变为const,int转变为double,void*转变为typed指针等等,但是无法把const转变为non-const,这只能通过const_cast做到。
上述代码中base class指针指向一个derived class对象,有时候两者的指针值不同,也就是说,一个class可能拥有一个以上的地址——比如base class*和derived class*指向他的地址不同。
上述代码是不可行的,原因是即使使用了static_cast转型,执行window::onResize()的并不是这个原本的SpecialWindow对象,而是这个SpecialWindow对象中base class的成分的副本,所以直接这么写即可:
如果可以,尽量在代码中避免转型,尤其是避免dynamic_cast