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

与C语言比,C++提供四种新式转型动作:

1.const_cast<T> (expression)

 除去对象的常量性

2.dynamic_cast<T> (expression)

 主要执行“安全向下转型”。这种无法由旧式语言执行。成本耗费最大。

 成本花费高,为什么还需要这种转型?通常是因为你想在一个你认定的derived class对象身上执行derived class操作的函数,但是你手上只有一个"指向base"的pointer或者reference。

 第一个example

 class Window{...};

 class SpecialWindow::public Window

 {

   public:

     void blink();

    ...

 };

typedef std::vector<std::tr1::shared_ptr<Window> > VPW;

VPW winPtrs;

...

for(VPW::iterator iter = winPtrs.begin();iter!=winPtrs.end();iter++)

{

   if(SpecialWindow* psw=dynamic_cast<SpecialWindow*>(iter->get()))

    psw->blink();

我们应该这样做:

typedef std::vector<std::tr1::shared_ptr<SpecialWindow> > VPSW;

VPSW winPtrs;

...

for(VPSW::iterator iter = winPtrs.begin();iter!=winPtrs.end();iter++)

{

    (*iter)->blink();

第二、对于上面的问题,我们可以采用虚函数实现

我们这里强调的是尽量不要使用转型

3.reinterpret_cast<T> (expression)

  执行低级转型。如:pointer to int 转换为int

4.static_cast<T> (expression)

  强迫隐式转型。如将non-const转型为const。int----double等

  如: class Widget{

       public:

          explict Widget(int size);

          ...

    };

    void doSomething(const Widget& w);

    doSomething(Widget(15));

    doSomething(static_cast<Widget>(15));//转型

 

  


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值