C++读书笔记之静态转换(static_cast)
相对动态类型转换,静态类型转换则做范围更广的转换,但前提是必须是相关的类型,也就是说,编译器必须认为是可理解的,例如,一个非多态的类层次结构,祖孙对象的指针互易。如,研究生对象指针到学生对象指针的转换,或反之。由于void *到任何类型指针都可以进行想融性的转换,所以,void *到学生对象的指针转换也可以由static_cast来进行,还是从局部堆空间申请的空间转换为整形数组空间等。甚至有时候,要将void * 转到多态对象的指针,也要先经过static_cast过度一下。
void fn(void * pd, void * pa)
{
Student s("John");
GraduateStudent gs("Smith");
Student * ps = static_cast<Student *> (&gs);
GraduateStudent * pgs = static_cast<GraduateStudent *> (ps);
Student * pp = static_cast<Student *> (pd);
Account * px = static_cast<Account *> (pa);
Saving * pSa = dynamic_cast<Saving *> (px);
int * p = static_cast<int *> (malloc(100));
}
假如Student类与GraduateStudent类无关,那么ps和pgs指针只能是NULL(#define NULL 0);假如pd不是指针,而因为pp是指针,所以pp的值也只能是NULL;假如pa不是指针,则px的值只能是NULL,而且连累到pSa的值也是NULL;这就是使用static_cast所带来的类型安全转换的检查帮助,比无根据地进行类型转换形式type(表达式)的"防盗性"要强,因为通过指针的非NULL判断,static_cast可以避免该转换后的操作失常。
static_cast转换并不是专门针对指针的,只要是相关类型的转换,都可以操作。无非它主要是针对确定的类型,而不是针对多态。关于多态的类型转换,由dynamic_cast去做。