学会思考
刻意练习

static_cast

静态转型的用途

  • 与dynamic_cast不同,static_cast不仅可以用于指针和引用,还可以用于其他型式
  • 一般用于非类型式的普通数据对象转型

静态转型的问题

  • 不进行运行期型式检查,不安全
  • 若转型失败,结果无定义

const_cast

常量转型的目的

  • 用于取消或者设置量的const状态(如设置为const或者取消const)

 

常量转型的问题

  • 如果原始数据对象不能写入,则取消常量修饰可能会导致未知的结果

例子:

#include <iostream>

class ConstCastTest
{
public:
    void SetNum(int num) { _num = num; }
    void PrintNum() const;
private:
    int _num;
};

void ConstCastTest::PrintNum() const
{
    //临时取消常量约束,修改目标对象的内容
    //this指向const ConstCastTest*,指向常对象的指针
    const_cast<ConstCastTest*>(this)->_num--;
    std::cout << _num;
}

reinterpret_cast

复诠转型的目的

  • 将任意型式的数据对象转型为目标型式,即重新解释其位序列的意义
  • 可以用于整型与指针型的互转

复诠转型的问题

  • 由程序员保证重新解释的数据对象是否有意义,编译器简单按照目标型式理解该存储区的内容
  • 注意:在64位操作系统中,指针可能为64位,而整型可能为32位,复诠转型有可能丢失数据或者得到错误结果

例子:

#include <iostream>
using namespace std;

int f(void *p)
{
    unsigned int n = reinterpret_cast<unsigned int>(p);
    return n;
}

int main()
{
    int a[8] = { 1,2,3,4,5,6,7,8 };
    int n = f(a);
    cout << n << endl;
}

 

posted on 2017-01-04 22:05  Worty  阅读(175)  评论(0编辑  收藏  举报