C++之四种强制类型转换

    技术2022-07-11  94

    C++之四种类型转换加粗样式**** C++是一种强类型的语言,在实际编码过程中,经常需要用到类型转换。 在数据类型转换过程中,C++对C兼容,使用显式或者隐式转换,显式是直接用小括号强制转换,type A = (type)B,隐式是直接 float B = 0.5; int A = B; 这样隐式截断这样隐式的截断是向 0 取整。

    除对C兼容外,还有四个强制类型转换关键字: const_cast,static_cast,dynamic_cast、reinterpret_cast

    const_cast 在C语言中,const通常用来限定该变量的值不能被修改。 而const_cast用于强制去掉这种不能被修改特性(const或volatile属性),但需要特别注意的是const_cast不是用于去除变量的常量性,而是只能去除指向对象的指针或引用的常量性,其去除常量性的对象必须为指针或引用。 用法为:const_cast<类型说明符> (常量或引用) 1、该运算符用来修改类型的const或volatile属性。 2、常量指针被转化成非常量指针,并且仍然指向原来的对象。 3、常量引用被转换成非常量引用,并且仍指向原来的对象,常量对象被转换成非常量对象。 例: #include using namespace std;

    int main() { const int A = 1; const int * P = &A; int *q; q = const_cast<int *>§; *q = 2; return 0; }

    static_cast static_cast是四种中是最常见的. 用法为:static_cast <类型说明符> (变量或表达式) 1、C++中内置基本数据类型之间的转换,如把int转换成char,这种转换的安全性也要开发人员来保证。 2、类层次结构中基类和派生类之间指针或引用的转换。进行上行转换(将派生类的指针或引用转换成基类表示)是安全的; 进行下行转换(将基类指针或引用转换成派生类表示)时,因没有动态类型检查,所以是不安全的。 3、将空指针转换成目标类型的空指针。 4、将任意类型的表达式转换成void类型。 *static_cast只能在有相互联系的类型中进行相互转换,不一定包含虚函数。 例: #include using namespace std;

    int main() { const auto A = 5; const auto B = 2;

    Auto ret1 = static_cast(float)A; Auto ret2 = static_cast(double)B;

    Cout <<“ret1 = ”<<ret1<<endl;

    Cout <<“ret2 = ”<<ret1<<endl; return 0; }

    dynamic_cast 用法:dynamic_cast<类型说明符> (自定义类、对象、结构体) *类型说明符不能为基本数据类型。

    1、其他三种都是编译时完成的,dynamic_cast 是运行时处理的,运行时要进行类型检查。 2、dynamic_cast 要求 <> 内所描述的目标类型必须为指针或引用。dynamic_cast 转换如果成功的话返回的是指向类的指针或引用,转换失败的话则会返回 NULL。 3、使用 dynamic_cast 进行转换的,基类中一定要有虚函数,否则编译不通过。 4、在类的转换时,在类层次间进行上行转换(子类指针指向父类指针)时,dynamic_cast 和 static_cast 的效果是一样的。在进行下行转换(父类指针转化为子类指针)时,dynamic_cast 具有类型检查的功能,比 static_cast 更安全。 向上转换,即为子类指针指向父类指针(一般不会出问题);向下转换,即将父类指针转化子类指针。 向下转换的成功与否还与将要转换的类型有关,即要转换的指针指向的对象的实际类型与转换以后的对象类型一定要相同,否则转换失败。 在C++中,编译期的类型转换有可能会在运行时出现错误,特别是涉及到类对象的指针或引用操作时,更容易产生错误。Dynamic_cast操作符则可以在运行期对可能产生问题的类型转换进行测试。

    reinterpret_cast 用法为:reinterpret_cast <类型说明符> (expression)。 type-id 必须是一个指针、引用、算术类型、函数指针或者成员指针。它可以把一个指针转换成一个整数,也可以把一个整数转换成一个指针(先把一个指针转换成一个整数,在把该整数转换成原类型的指针,还可以得到原先的指针值)。

    reinterpret_cast 主要有三种强制转换用途: 1、改变指针或引用的类型 2、将指针或引用转换为一个足够长度的整形 3、将整型转换为指针或引用类型。

    Processed: 0.010, SQL: 9