“业余程序员”小谈C++类型转换

 

前言

对于C++代码中的类型转换,我从来都习惯用C风格转换(在C++中被称为旧式转换)。实际上,我写的很多代码都很少注重效率。而在新公司里一位对C++代码效率要求极高的team leader看过我写的代码后,直接建议我去读下《effective c++》,说这本书是从业余程序员到专业程序员的分水岭。 呵呵,自叹不如啊。 写了那么多年的C++,而今还被人看做业余程序员,情何以堪! 事实上,这本书我很早以前就看过,只是一直感觉里面很多都太苛刻,所以很少注意。 说到这,不得不为自己以前的浮躁自责。其实被人笑作业余程序员也就不足为怪了。 突然感觉自己钻的不够深,那么从今日起,就得在C++代码效率方面更用功些了。

 

进入主题

对于C++的4种类型转换,static_cast相当于C语言中的函数式转换; dynamic_cast通常用来将基类对象或指针转换为子类对象或指针; const_cast用来去除对象或变量的常量性; reinterpret_cast只进行二进制级别的比特转换,在实际应用中很少用到. 看看如下代码:

 

    #include <iostream> 
     
    using namespace std; 
     
     
    class Window 
    { 
    private: 
    public: 
        virtual void ShowWindow() 
        { 
            cout<<"base class window"<<endl; 
        } 
    }; 
     
    class MDIWindow:public Window 
    { 
    public: 
        virtual void ShowWindow() 
        { 
            Window::ShowWindow(); 
            cout<<"derived class window"<<endl; 
        } 
    }; 
     
    int main(int *argc , char **argv) 
    { 
        int nValue; 
        float fValue = 10.0f; 
         
        nValue = static_cast<int>(fValue); 
        cout<<"nValue is : "<<nValue<<endl; 
         
        const char* pszStr = "abcdefg"; 
        char *pszStr1 = const_cast<char*>(pszStr); 
     
        cout<<"pszStr is : "<<pszStr<<endl; 
        cout<<"pszStr1 is : "<<pszStr1<<endl; 
     
        Window *pWindow; 
        MDIWindow *pMdiWindow = new MDIWindow(); 
        pWindow = static_cast<Window*>(pMdiWindow); 
     
        pWindow->ShowWindow(); 
     
        if (MDIWindow *pTempMdiWindow = dynamic_cast<MDIWindow*>(pWindow)) 
        { 
            pTempMdiWindow->ShowWindow(); 
        } 
        else 
        { 
            cout<<"dynamic_cast error!"<<endl; 
        } 
     
        delete pMdiWindow; 
        return 0; 
    } 

在effective c++中,作者建议在高效要求的代码中,尽量少使用或者不适用强制类型转换,因为每次转换都会增加或多或少的运行成本,尤其是dynamic_cast,而reinterpret_cast也往往会带来意想不到的BUG。 而对于C风格的转换和C++风格的转换,作者也建议尽量使用C++类型转换,正如作者所说“C++风格容易辨识出来,而且有着分门别类的执掌”。

 

最后顺便感叹一下51CTO对WLW的代码tags的支持真的很让人无语。。 在WLW官网下载了很多代码tags,发布出来的文章中代码大多都成乱码了,不知51CTO什么时候能改善下。。。

posted on 2012-01-21 23:14  酋长Clement  阅读(210)  评论(0编辑  收藏  举报

导航