空间 建网站,wordpress安装教程wamp,网站新闻不添加关键词超链接对优化有影响吗,做门户网站用什么系统C旧式转型的缺点包括#xff1a;
没有类型安全检查#xff1a;允许将任何指针转换为其他类型指针#xff0c;可能导致未定义行为的错误#xff1b;难以识别和维护#xff1a;语法(type)expression 或 type(expression)在代码中难以被快速识别#xff1b;
为了解决上述问…C旧式转型的缺点包括
没有类型安全检查允许将任何指针转换为其他类型指针可能导致未定义行为的错误难以识别和维护语法(type)expression 或 type(expression)在代码中难以被快速识别
为了解决上述问题推荐使用C的四种转型操作符
static_casttype(expression)
用途用于非多态类型的转换。
场景
基本数据类型之间的转换如int到floatfloat到int。将基类指针或引用转换为派生类指针或引用反之亦然类型向上转换派生类到基类
int firstNumber 1, secondNumber 3;
double result (double)firstNumber/secondNumber; // C
double result2 static_castdouble(firstNumber)/secondNumber; // C
const_casttype(expression)
用途只用于修改类型的const或volatile属性
class Widget {};
class SpecialWidget : public Widget {};
void update(SpecialWidget* psw) {} SpecialWidget sw;
const SpecialWidget csw sw;
// update(csw); // error: invalid conversion from ‘const SpecialWidget*’ to ‘SpecialWidget*’
update((SpecialWidget*)(csw));
update(const_castSpecialWidget*(csw));
Widget *pw new SpecialWidget;
// update(pw); // error: invalid conversion from ‘Widget*’ to ‘SpecialWidget*’
update(const_castSpecialWidget*(pw)); // error: invalid const_cast from type ‘Widget*’ to type ‘SpecialWidget*’ dynamic_casttype(expression)
用途只用于处理多态类型的基类和派生类之间安全向下转换在运行时检查对象的类型安全性
注意
当转型对象是指针转型失败返回一个nullptr当转型对象是引用转型失败抛出异常
Widget *pw new SpecialWidget;
updateViaRef(static_castSpecialWidget(*pw));
// error: cannot dynamic_cast ‘* pw’ (of type ‘class Widget’) to type ‘class SpecialWidget’ (source type is not polymorphic)
updateViaRef(dynamic_castSpecialWidget(*pw)); reinterpret_casttype(expression)
用途用于转换”函数指针“类型不具备移植性
typedef void (*FuncPtr)();
FuncPtr funcPtrArray[10];
int doSomething() { return 0; }// funcPtrArray[0] doSomething; // error: invalid conversion from ‘int (*)()’ to ‘FuncPtr’ {aka ‘void (*)()’}
funcPtrArray[0] reinterpret_castFuncPtr(doSomething);
利用宏定义模拟新式转换
注意模拟的dynamic_cast不会进行是否转型成功的检查
#define static_cast(TYPE,EXPR) ((TYPE)(EXPR))
#define const_cast(TYPE,EXPR) ((TYPE)(EXPR))
#define reinterpret_cast(TYPE,EXPR) ((TYPE)(EXPR))
#define dynamic_cast(TYPE,EXPR) ((TYPE)(EXPR))