强制类型转换? ? ? ??
C++四种强制类型转换符:static_cast, reinterpret_cast, const_cast, dynamic_cast。
这四种强制类型转换的使用场合:
static_cast?
1、可用于强制隐型转换,如int转换为double、non-const对象转const对象。
2、可用于如void*指针转型为有类型的指针,父类指针转换为派生类指针,
3、注:它不能将一个const转换为non-const。
int?num?=?666888; double?num_static?=?static_cast<double>(n);? ? int?*ptr?=?# double?*num?=?static_cast<double?*>(&n)? //任意类型转换成void类型 void?*p?=?static_cast<void?*>(ptr);?
dynamic_cast?
1、一般用于执行"安全向下转型",也就是动态类型转换。如子类和父类之间的多态类型转换。主要用途:将基类的指针或引用安全地转换成派生类的指针或引用。
2、父类类型的指针变量不可向下调用派生类各个的成员(包含虚函数)。
3、注:子类指针转换成父类指针是安全的;但父类指针转换成子类指针是不安全的。
class?Base?{ public: int?m_Num; virtual?void?func(){}; }; ? class?Derived:?public?Base?{ public: ????char?*m_array[100]; void?function(){}; }; ? Base*?ptrb?=?new?Derived(); Derived?*ptrd?=?dynamic_cast<Derived?*>(ptrb); Base*?pb?=?new?Base(); Derived?*pd?=?static_cast<DerivedClass?*>(pb);
reinterpret_cast?
1、用于进行各种不同类型的指针之间、不同类型的引用之间以及指针和能容纳指针的整数类型之间的转换。
reinterpret_cast<type_id>(expression) int num = 0x00636261;//用16进制表示32位int,0x61是字符'a'的ASCII码 int * pnum = # char * pstr = reinterpret_cast<char *>(pnum); cout<<"pnum指针的值: "<<pnum<<endl; cout<<"pstr指针的值: "<<static_cast<void *>(pstr)<<endl;//直接输出pstr会输出其指向的字符串,这里的类型转换是为了保证输出pstr的值 cout<<"pnum指向的内容: "<<hex<<*pnum<<endl; cout<<"pstr指向的内容: "<<pstr<<endl; return 0;
此例子参考https://zhuanlan.zhihu.com/p/33040213
const_cast?
一般用于强制取消对象的常量性,就是去掉const属性。
|