您当前的位置: 首页 > 

phymat.nico

暂无认证

  • 6浏览

    0关注

    1967博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

类型转换操作符:static_cast, dynamic_cast, const_cast, reinterpret_cast.

phymat.nico 发布时间:2015-01-24 10:49:04 ,浏览量:6

呵呵,今天来好好看看着几个转换操作符的用法。以前老是看着眼熟,但是用着手生。今天决定搞定这些个东西。

在C语言中类型转换有几种方式:

1.      (expression). 在表达式外边加括号,由编译器来决定怎么改变。

2.      new_type(expression). 强制类型括号住表达式。

3.      (new_type)expression. 括号住强制类型。

4.      C语言允许的内置转换。

这些转换非常高效,我非常喜欢使用。特别是在指针转换和数值转换时用到的非常多。只要编写程序的人知道自己要做什么转换,并知道应该怎样转换的话,我认为上边的转换方式非常之好。但是没有清楚的了解每个转换的细节的话,就有可能出现问题,比如指针指向不应该指向的区域:出现野指针或者指向位置错误(主要是对内存结构不了解),或者计算数值被截去等问题发生。

C++程序兼容C语言的转化,但是针对面向对象语言的特性,设计了以下几个类型转换操作符。他们的出现是为了C语言类型转换中语义模糊和固有的危险陷阱,因为C语言不去判断所要操作的类型转换是否合理。

static_cast:用于非多态类型的转换。

dynamic_cast:用于多态类型的转换。

const_cast:用来消除const, volatile, __unaligned属性的转换。

reinterpret_cast:用于空间的重新解释。

还有一个在VS2005中出现的类型转换关键字safe_cast.#2

 

static_cast:

static_cast(expression)

这个关键字可以用来将一个指针转换为父类的指针也可以转换为子类的指针或者基本的类型转换。但是这种转换是强制的,并没有任何运行时类型检查来保证转换的正确性,所以编写代码的人需要明白自己所进行的转换是否合理。

//基本类型的转换

enum e { A = 1, B, C };

double d = 12.25;

unsigned int ui = 25;

char c = static_cast(ui);

int i = static_cast(d);

int j = static_cast(B);

//父类子类转换

class F                  //father

{

public:

    int _father;

};

class S : public F       //son

{

public:

    _son;

};

F *pFather = new F();

S *pSon = new S();

F *pF;

S *pS;

pF = static_cast(pSon);    //将子类指针转换为父类指针,OK

pS = static_cast(pFather); //将父类指针转换为子类指针,错误

第二个错误的转换不是说编译器编译不过去,而是运行时会出现错误。

原因如下:假设pF指向了pSon的位置,它可以访问_father,它找不到_son,这样没有问题。但是pS指向了pFather的位置,它访问_father没有问题,但是访问_son时就会产生错误,因为pFather根本没有_son这个变量。

下面是将父类转换为子类指针时,static_cast和dymanic_cast两者不同的表现:

class F

{

public:

    virtual void speak(){};

    int i;

};

 

class S : public F

{

public:

    void speak()

    {

       cout

关注
打赏
1659628745
查看更多评论
立即登录/注册

微信扫码登录

0.1484s