转换符:
static_cast
:强迫隐式转换,不包含底层const的任何具有明确定义的类型转换。——底层const也可以转,比如boost::simple_segregated_storage
中的 nextofconst_cast
:只能改变底层const;因为不能把一个const对象赋给非const对象,通过该函数可进行转换:去const属性;const char * pc;
char * p = const_cast<char*>(pc); //正确但通过p写值是未定义的行为
reinterpret_cast
:通常为运算对象的位模式提供较低层次上的重新解释,执行低级转型,实际动作取决于编译器,这也表示他是不可移植的,转换结构几乎都是在执行期定义。
-fpermissive
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; // 输出636261
cout << "pstr指向的内容: " << pstr << endl; // 输出 abc
// 如果将num的值改为64636261,patr输出abcd***(abcd后几个乱码),原因是,pstr会一直输出直到遇到'\0'
// 所以,如果访问到非法地址,会崩溃
dynamic_cast
:支持运行时类型识别,主要被用于安全地沿着类的继承关系向下进行类型转换,将一个基类转换成派生类
A=dynamic_cast(B)
(typeA通常含有虚函数)备注:
保证安全的向下转型操作:
保证安全的动态转型:dyanmic_cast可以在执行期决定真正的类型,如果是安全的(也就是说父类指针指向派生类对象),这个运算符会传回被适当转型过的指针,如果不是安全的,会传回空