C++为了加强类型转换的可视性,引入了四种命名的强制类型转换符
static_cast:用于非多态类型的转换(静态转换),任何标准类型之间都可以用它。但是不能用于不相关两个类型的转换。
int i=2;
double d=static_cast<double>(i)//正确,两个类型相关
int*p=&i;
double d=static_cast<double>(p)//错误,不相关类型
dynamic_cast : 用于将基类的对象的指针或引用转换为派生类对象的指针或引用。
当目标类型为某种类型的指针时,如果转换成功则返回目标类型的指针,否则返回NULL。
当目标类型为某种类型的引用时,如果转换成功则返回目标类型的引用,否则抛出异常,因为不存在NULL引用。
两个方向的转换:
(1)向上转:派生类型的指针或引用转换成基类的指针或引用(实际可以隐式转换,不必显示转换)
(2)向下转:基类的指针或引用转换成派生类的指针或引用。
注意:dynamic_case只能用于含有虚函数的类。
代码示例:
#include<iostream>
using namespace std;
class A
{
public:
virtual void f()
{}
};
class B:public A
{};
void fun(A *pa)
{
B* pb1 = static_cast<B*>(pa);
B* pb2 = dynamic_cast<B*>(pa);
cout << "pb1:" << pb1 << endl;
cout << "pb2:" << pb2 << endl;
}
int main()
{
A a;
B b;
fun(&a);
fun(&b);
system("pause");
return 0;
}
reinterpret_cast操作符通常为操作数的位模式提供较低层次的重新解释,用于将一种类型转换为另一种不同的类型。
const_cast:用于删除对变量const的属性,便于赋值。
void Test()
{
const int n = 10;
int* p =const_cast<int *>(&n);
*p = 20;
cout << n << endl; //结果是10,因为编译器有优化,所以会到寄存器中取值
cout << *p << endl; //结果是20,b指向内存中的i,改的是内存中的值
}
附加:
explicit 关键字
阻止经过转换构造函数进行的隐式类型转换
#include<iostream>
using namespace std;
class A
{
public:
/*explicit*/ A(int a)
{
cout << "A(int a)" << endl;
}
A (const A&a)
{
cout << "A const(A&a)" << endl;
}
private:
int _a;
};
int main()
{
A a1(1);
// A temp(1)----------A a2(temp)
//explicit 阻止经转换构造函数进行的隐式类型转换
A a2=1;
system("pause");
return 0;
}