C++中强制转换函数总结
副标题#e#
尺度c++中主要有四种强制转换范例运算符:
const_cast,reinterpret_cast,static_cast,dynamic_cast等等。
1)static_cast<T*>(a)
将地点a转换成范例T,T和a必需是指针、引用、算术范例或列举范例。
表达式static_cast<T*>(a),a的值转换为模板中指定的范例T.在运行时转换进程中,不举办范例查抄来确保转换的安详性。
例子:
class B { ... };
class D : public B { ... };
void f(B* pb, D* pd)
{
D* pd2 = static_cast<D*>(pb); // 不安详, pb大概只是B的指针
B* pb2 = static_cast<B*>(pd); // 安详的
...
}
class B { ... };
class D : public B { ... };
void f(B* pb, D* pd)
{
D* pd2 = static_cast<D*>(pb); // 不安详, pb大概只是B的指针
B* pb2 = static_cast<B*>(pd); // 安详的
...
}
class B { ... };
class D : public B { ... };
void f(B* pb, D* pd)
{
D* pd2 = static_cast<D*>(pb); // 不安详, pb大概只是B的指针
B* pb2 = static_cast<B*>(pd); // 安详的
...
}
2)dynamic_cast<T*>(a)
完成类条理布局中的晋升。T必需是一个指针、引用或无范例的指针。a必需是抉择一个指针或引用的表达式。
表达式dynamic_cast<T*>(a) 将a值转换为范例为T的工具指针。假如范例T不是a的某个基范例,该操纵将返回一个空指针。
例子:
class A { ... };
class B { ... };
void f()
{
A* pa = new A;
B* pb = new B;
void* pv = dynamic_cast<A*>(pa);
// pv 此刻指向了一个范例为A的工具
...
pv = dynamic_cast<B*>(pb);
// pv 此刻指向了一个范例为B的工具
}
#p#副标题#e#
3)const_cast<T*>(a)
去掉范例中的常量,除了const或不不变的变址数,T和a必需是沟通的范例。
表达式const_cast<T*>(a)被用于从一个类中去除以下这些属性:const, volatile, 和 __unaligned.
例子:
class A { ... };
void f()
{
const A *pa = new A; //const工具
A *pb; //非const工具
//pb = pa; // 这里将堕落,不能将const工具指针赋值给非const工具
pb = const_cast<A*>(pa); // 此刻OK了
...
}
class A { ... };
void f()
{
const A *pa = new A; //const工具
A *pb; //非const工具
//pb = pa; // 这里将堕落,不能将const工具指针赋值给非const工具
pb = const_cast<A*>(pa); // 此刻OK了
...
}
class A { ... };
void f()
{
const A *pa = new A; //const工具
A *pb; //非const工具
//pb = pa; // 这里将堕落,不能将const工具指针赋值给非const工具
pb = const_cast<A*>(pa); // 此刻OK了
...
}
4)reinterpret_cast<T*>(a)
任何指针都可以转换成其它范例的指针,T必需是一个指针、引用、算术范例、指向函数的指针或指向一个类成员的指针。
表达式reinterpret_cast<T*>(a)可以或许用于诸如char* 到 int*,可能One_class* 到 Unrelated_class*等雷同这样的转换,因此大概是不安详的。
例子:
class A { ... };
class B { ... };
void f()
{
A* pa = new A;
void* pv = reinterpret_cast<A*>(pa);
// pv 此刻指向了一个范例为B的工具,这大概是不安详的
...
}