设为首页 加入收藏

TOP

C++强制类型转换操作结果的总结(一)
2012-11-30 12:25:27 来源: 作者: 【 】 浏览:1132
Tags:强制 类型 转换 操作 结果 总结

    C++(www.cppentry.com)类型转换在刚学习C++(www.cppentry.com)不久就接触到的东西,由于那会儿对C++(www.cppentry.com)机制的不熟悉,并没有太多的疑问。随着对C++(www.cppentry.com)进一步的了解,基本类型转换应该可以理解为生成了对应类型的临时变量。昨天看到了Effective C++(www.cppentry.com)条款3中,类的const与non-const重载函数,non-const函数调用const函数实现重载,即所谓的常量性转除(casting away constness)。示例程序代码如下:

    class CTextBox

    {

    public:

    CTextBox(void);

    CTextBox(char *szStr);

    ~CTextBox(void);

    const char& operator[](std::size_t pos) const

    { return m_strText[pos]; }

    char& operator[](std::size_t pos)

    {

    return const_cast<char&>((static_cast<const CTextBox&>(*this))[pos]);

    }

    private:

    std::string m_strText;

    };

    操作符重载函数operator[]的non-const版本对this*做了类型转换,使其能够调用const版本的operator[]函数,如果按照基本类型转换的临时变量理解,函数最后相当于返回了对临时变量的引用,这显然是错误的,而且不能达到程序员想要的目的。但是经过对代码的编译运行,发现程序能够通过正确运行。所以产生了如下疑问:类型转换用于常量性移除时,是否针对原变量操作,而不是生成了变量;由此考虑类型转换的其他用途,比如对于指针的转换等,是以何种方式进行的。下面引用神秘果的blog中关于C++(www.cppentry.com)类型转换的总结:

    C风格的强制类型转换(Type Cast)很简单,不管什么类型的转换统统是:

    TYPE b = (TYPE)a.

    C++(www.cppentry.com)风格的类型转换提供了4种类型转换操作符来应对不同场合的应用。看似问题复杂化了,其实不然。C风格的类型转换在程序语句中难以识别,类型转换是去const,还是int转换成char,或是子类指针转换成父类指针?C括号风格的强制类型转换解决不了这些问题。C++(www.cppentry.com)的4种类型转换能够解决这些问题:

    const_cast,字面上理解就是去const属性。

    static_cast,命名上理解是静态类型转换。如int转换成char.

    dynamic_cast,命名上理解是动态类型转换。如子类和父类之间的多台类型转换。

    reinterpreter_cast,仅仅重新解释类型,但没有进行二进制的转换。

    4种类型转换的格式,如:TYPE B = static_cast(TYPE)(a)。

    const_cast

    去掉类型的const或volatile属性。

    struct SA {

    int i;

    };

    const SA ra;

    //ra.i = 10; //直接修改const类型,编译错误

    SA &rb = const_cast<SA&>(ra);

    rb.i = 10;

    static_cast

    类似于C风格的强制转换。无条件转换,静态类型转换。用于:

    1、基类和子类之间转换:其中子类指针转换成父类指针是安全的;但父类指针转换成子类指针是不安全的。(基类和子类之间的动态类型转换建议用dynamic_cast)

    2、基本数据类型转换。enum,struct,int,char,float等。static_cast不能进行无关类型(如非基类和子类)指针之间的转换。

    3、把空指针转换成目标类型的空指针。

    4、把任何类型的表达式转换成void类型。

    5、static_cast不能去掉类型的const、volitale属性(用const_cast)。

    1 int n = 6;

    2  double d = static_cast<double>(n); // 基本类型转换

    3  int *pn = &n;

    4 double *d = static_cast<double *>(&n) //无关类型指针转换,编译错误

    5 void *p = static_cast<void *>(pn); //任意类型转换成void类型

    6

    dynamic_cast

   

首页 上一页 1 2 3 4 5 下一页 尾页 1/5/5
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇HDU 2363 Cycling 下一篇VC--用DLL生成LIB文件

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: