C++转换类型的方法?
一般学校只学了强制类型转换(强转)const,但其实C++不止可以将基本数据类型转换,有父类和子类的转换,甚至还有整型转换为指针。所以,别再说C++只有强转了。
C++有四种常见的转换方式(静态转换,动态转换,常量转换,重新解释转换)
1.静态转换
①用于类层次结构中基类(父类)和派生类(子类)之间的指针或引用的转换。
②用于基本数据类型之间的转换,如int转换为char,char转换为int。但安全性需要开发者保证。
static_cast<要转到的类型>(将谁转换)
//1.基础类型转换
char a = 'a';
//static_cast<要转到的类型>(将谁转换)
//char->double
double d = static_cast<double>(a);
//2.有层次类的指针或引用转换
Father *f = NULL;
Son *s = NULL;
//向下转(不安全)
Son* S1 = static_cast<Son*>(f);
//向上转(安全)
Father* F1 = static_cast<Father*>(s);
//没有继承关系的类之间的指针不能转换
//Other *o = static_cast<Other*>(s);
//3.引用转换
Father f;
Son s;
Father &ref_f = f;
Son &ref_s = s;
//向上转(安全)
static_cast<Father&>(ref_s);
//向下转(不安全)
static_cast<Son&>(ref_f);
2.动态转换
①用于类层次结构间的上行转换和下行转换。
②基础类型不能使用动态转换。
③在类层次间进行上行转换时,dynamic_cast(动态转换)和static_cast的效果一样。
④在进行下行转换时,dynamic_cast具有类型检查功能,比static_cast更安全。
dynamic_cast<要转到的类型>(将谁转换)
Father *f = NULL;
Son *s = NULL;
//向上(安全)
Son *f1 = dynamic_cast<Father*>(s);
//向下(不安全,会检查)
Son *s1 = dynamic_cast<Son*>(f);
3.常量转换
①常量指针被转换为非常量指针,并且仍指向原来的对象;
②常量引用被转换为非常量引用,并且仍指向原来的对象;
const_cast<要转到的类型>(将谁转换)
const int *p = NULL;
//const->不带const
int *newP = const_cast<int*>(p);
//不带const->const
int *pp = NULL;
const int *newPP = const_cast<const int*>(pp);
4.重新解释转换
①将一种数据类型从一种类型转换为另一种类型,例如可以将一个指针转换成一个整数,也可以将一个整数转换成一个指针。(这种转换机制非常不安全)
reinterpret_cast<要转到的类型>(将谁转换)
//整型->指针
int a = 10;
int *p = reinterpret_cast<int *>(a);
//a类->b类
Father *f = NULL;
Other *o = reinterpret_cast<Other *>(f);