c++范例转换
在 C 言语中,举行范例转换只需要在变量前面加上变量范例,而且转换可所以双向的。比方 int 范例能够转换为 double 范例,double 范例也能够转换为 int 范例。(引荐教程:c++手册教程)
然则这类简朴粗犷的体式格局在 C++ 中是不合适的。第一,没法完成 C++ 中的自定义数据范例类;第二,C 言语能够在恣意范例之间转换,比方能够将一个指向 const 型对象的指针转换为指向一个非 const 型对象的指针,这对范例搜检非常严厉的 C++ 来讲,显然是不合理的,所以 C++ 供应了4种特有范例转换操作符。
1、static_cast
类似于 C 言语中的范例转换,能够举行无条件范例转换。运用场景:
基础范例转换。
int i = 1; double j = static_cast <double> (i);
父类和子类指针之间的转换。假如父类指针指向一个对象,此时将父类指针转换为子类指针是不平安的,子类指针转换为父类指针是平安的。
class Base( ) { }; class Derived : public Base { }; Base * p1 = new Base; Derived * p2 = new Derived; Derived * p3 = static_cast <Derived *> (p1); // 不平安 Base * p4 = static_cast <Base *> (p2); // 平安
将任何范例的表达式转换为 void 范例。
注:static_cast 不能去除范例的 const 或许 volatile 属性;不能举行无关范例转换(如非基类和子类)。
2、dynamic_cast
dynamic_cast 只能用于对象指针之间的转换,转换结果亦可所以运用。在类条理间举行上行转换时,dynamic_cast 和 static_cast 的结果是一样的;在举行下行转换时,dynamic_cast 具有范例搜检的功用,比 static_cast 更平安。
class Base { virtual void dummy ( ) { } }; class Derived : public Base { }; Base * b1 = new Base; Base * b2 = new Derived; Derived * b3 = dynamic_cast <Derived * > (b1); // 转换失利,返回 NULL Derived * b4 = dynamic_cast <Derived * > (b2); // 转换胜利 Derived & b5 = dynamic_cast <Derived & > (b1); // 转换失利(抛出非常) Derived & b6 = dynamic_cast <Derived & > (b2); // 转换胜利
注:父子类指针之间转换时,该父类中必需包括一个虚函数。
3、const_cast
用于掏出 const 属性,去掉范例的 const 或许 volatile 属性,将 const 范例的指针变成非 const 范例的指针。
const int * fun(int x, int y) { }; int * ptr = const_cast < int * > (fun(2, 3));
4、reinterpret_cast
reinterpret_cast 只是从新诠释范例,没有二进制的转换。运用:
转换的范例必需是一个指针、援用、算术范例、函数指针或许成员指针。比特位级别上举行转换。它能够把一个指针转换成一个整数,也能够把一个整数转换成一个指针(先把一个指针转换成一个整数,再把该整数转换成原范例的指针,还能够获得本来的指针值)。但不能将非32bit的实例转成指针。
平常用在函数指针范例之间举行转换。
不能保证可移植性。
注:此范例转换不平安,需谨慎运用。
以上就是c++范例转换的细致内容,更多请关注ki4网别的相干文章!