注意类型转换——Effective C++

注意类型转换:

C++提供了四种新式类型转换:

const_cast<T>(expression);
static_cast<T>(expression);
dynamic_cast<T>(expression);
reinterpret_cast<T>(expression);

static_cast 和 旧式转换

在编程中我们经常使用强制类型转换,尤其是在竞赛中int不够的时候

int a = 100;
double x = (double)a;

static_cast和它差不多,只是能够让人们更清晰地识别出它是一个强制类型转换


类中的类型转换:

class Window{
public:
    virtual void onResize(){……};
    ……
};
class specialWindow:public Window{
public:
    virtual void onResize(){
        static_cast<Window>(*this).onResize();//将this转为Window,然后调用。这样其实不行。
        ……
    }
};

这段代码中,使用了转型动作,我们所预期的是将this转为Window,之后调用Window::onResize。但实际上并不是这样,static_cast(*this).onResize()所调用的是暂时副本身上的onResize()。如果onResize中修改了数据,并不会作用在当前的对象。
最好还是使用域操作符::


dynamic_cast:

可以实现向下的转换,但是效率很低
如果你使用dynamic_cast的地方可以用虚函数多态替代,最好还是用虚函数。


参考:

《Effective C++》
《C++Primer 5》

posted @ 2017-03-27 17:44  Przz  阅读(145)  评论(0编辑  收藏  举报