C++中四种类型转换方式

类型转换有c风格的,当然还有c++风格的。c风格的转换的格式很简单(TYPE)EXPRESSION,但是c风格的类型转换有不少的缺点,有的时候用c风格的转换是不合适的,因为它可以在任意类型之间转换,比如你可以把一个指向const对象的指针转换成指向非const对象的指针,把一个指向基类对象的指针转换成指向一个派生类对象的指针,这两种转换之间的差别是巨大的,但是传统的c语言风格的类型转换没有区分这些。还有一个缺点就是,c风格的转换不容易查找,他由一个括号加上一个标识符组成,而这样的东西在c++程序里一大堆。所以c++为了克服这些缺点,引进了4新的类型转换操作符,他们是1.static_cast 2.const_cast 3.dynamic_cast 4.reinterpret_cast.

1.static_cast

最常用的类型转换符,在正常状况下的类型转换,如把int转换为float,如: int ifloat ff=floati 或者 f=static_cast<float>(i);

2.const_cast

用于取出const属性,把const类型的指针变为非const类型的指针,如: const intfun(int x,int y)  intptr=const_cast<int>(fun(23))

3.dynamic_cast
这个是绕了我很久的一个概念。该转换符用于将一个指向派生类的基类指针或引用转换为派生类的指针或引用,什么意思?解释如下:

#include<iostream>
using namespace std;
class A
{
public:
    virtual void f()//基类中必须存在虚函数
    {
        cout<<"class A"<<endl;
    }
};
class B:public A
{
public:
    void f()
    {
        cout<<"class B"<<endl;
    }

};
int main()
{
    A* pa;
    B* pb;
    B b;
    pa=&b;//指向派生类的基类指针
    pb=dynamic_cast<B*>(pa);//转换为派生类的指针 

    return 0;
}

有的人应该会觉得多此一举,我们何不直接写成pb=&a就好了吗?我也是这么觉得的,但是我们生成pb的目的是什么了?请看下面代码,我们在调用函数func时,是允许我们传入子类对象实例的,那么此时就自发的完成了父类对象指针指向子类对象实例,即B* pb=new D,但是我们此时可能需要调用的是子类对象中的成员或者方法,所以我们就需要强制类型转换了D* pd2=dynamic_cast<D*>(pb)。下面的代码段中,如果 pb 指向一个 D 类型的对象,pd1 和 pd2 是一样的,并且对这两个指针执行 D 类型的任何操作都是安全的;但是,如果 pb 指向的是一个 B 类型的对象,那么 pd1 将是一个指向B对象的指针,对它进行 D 类型的操作将是不安全的(如访问 m_szName),而 pd2 将是一个空指针。这就是dynamic_cast的特殊之处了。

class B
{
public:
int m_iNum;
virtual void foo();
};

class D:public B
{
public:
char* m_szName[100];
};

void func(B* pb)
{
D* pd1=static_cast<D*>(pb);
D* pd2=dynamic_cast<D*>(pb);
}

4.reinterpret_cast

reinterpret_castreinterpret_cast<typeid>(expression)

允许将任何指针类型转换为其它的指针类型;听起来很强大,但是也很不靠谱。它主要用于将一种数据类型从一种类型转换为另一种类型。它可以将一个指针转换成一个整数,也可以将一个整数转换成一个指针,在实际开发中,先把一个指针转换成一个整数,在把该整数转换成原类型的指针,还可以得到原来的指针值;特别是开辟了系统全局的内存空间,需要在多个应用程序之间使用时,需要彼此共享,传递这个内存空间的指针时,就可以将指针转换成整数值,得到以后,再将整数值转换成指针,进行对应的操作。

参考文献:
果冻想
百度文库

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值