Effective C++(8)

目录

条款25 Consider support for a non-throwing swap

条款26 Postpone variable definitions as long as possible

条款27 Minimize casting


条款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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值