C++中类型的强制转换

C++中类型的强制转换分为以下四种:

1、static_cast<T>(expr);

2、reinterpret_cast<T>(expr);

3、const_cast<T>(expr);

4、dynamic_cast<T>(expr);

其中前三种为编译时检查,最后一种为运行时检查。

static_cast<T>(expr):用于基本类型之间的转换,但不能用于基本类型指针之间的转换,用于有继承关系的类之间的转换,用于有继承关系类指针之间的转换。

reinterpret_cast<T>(expr):用于指针类型之间的强制转换,用于指针和整数之间的转换。

const_cast<T>(expr):去掉变量的const属性。

dynamic_cast<T>(expr):主要用于类层次之间的转换,必须要有多态(继承,虚函数重写)。

 

static_cast<T>(expr);

#include<iostream>
using namespace std;
class A
{};
class B : public A
{};
int main()
{int a=1;double b;a=static_cast<int>(b);      //可以用于基本类型之间的转换/*int *pa;char *pc;pa=static_cast<int>(pc);    //不能用于基本类型之间指针的转换*/A aa;B bb;aa=static_cast<A>(bb);      //可以用于有继承关系之间类的转换//bb=static_cast<B>(aa);   不能将基类赋值给派生类A *pa1;B *pb1;pa1=static_cast<A *>(pb1);pb1=static_cast<B *>(pa1);  //可以用于有继承关系之间类指针之间的转换return 0;
}

reinterpret_cast<T>(expr);

#include<iostream>
using namespace std;
int main()
{int a=1;char b='a';int *pa=&a;char *pb=&b;pa=reinterpret_cast<int *>(pb);pb=reinterpret_cast<char *>(pa);return 0;
}

const_cast<T>(expr);

#include<iostream>
using namespace std;
int main()
{const int a=1;int *pa = const_cast<int *>(&a);const int &b=1;       //用常量给常引用赋值int &c=const_cast<int &>(b);c=2;cout << b << endl;  //常引用时值可以改变const int d=1;      //常量int &e=const_cast<int &>(d);e=2;cout << d << endl;  //值不可以被改变return 0;
}

dynamic_cast<T>(expr);

#include<iostream>
using namespace std;
class A
{
private:int m_a;
public:virtual void show(){}
};
class B : public A
{
private:int m_b;
public:virtual void show(){}
};
int main()
{A a;B b;A *pa=&a;B *pb=&b;//pa=dynamic_cast<A *>(pb);  pa=dynamic_cast<A *>(&b);        //主要用于类层次之间的转换,必须具有多态性,动态检查。pb=dynamic_cast<B *>(&a);return 0;
}