这正是dynamic_cast提升安全性的功能,dynamic_cast可以识别出不安全的下行转换,但并不抛出异常,而是将转换的结果设置成null(空指针)。 再举一个例子: 1#include <iostream>2#include <exception>3usingnamespacestd;45classCBase {virtualvoiddummy() {} };6classCDerived:publicCBase {inta; };78intmain ()...
D *pd1 = static_cast<D *>(pb); //copile error D *pd2 = dynamic_cast<D *>(pb); //pd2 is NULL delete pb; } 在函数foo中,使用static_cast进行转换是不被允许的,将在编译时出错;而使用 dynamic_cast的转换则是允许的,结果是空指针。 reinpreter_cast 用法:reinpreter_cast<type-id> (expressio...
输出结果是:Null pointer on second type-cast 两个dynamic_cast都是下行转换,第一个转换是安全的,因为指向对象的本质是子类,转换的结果使子类指针指向子类,天经地义;第二个转换是不安全的,因为指向对象的本质是父类,“指鹿为马”或指向不存在的空间很可能发生! 最后补充一个特殊情况,当待转换指针是void*或者转...
1. static_cast<void*>()静态转换 static_cast和 reinterpret_cast的几种使用场景 2. reinterpret_cast<void *>()重新解释转换 A:指针与整数之间的转换: B:指针之间的转换 C:不相关类型的指针之间的转换 D:函数指针之间的转换: 3. const_cast 常量转换 4. dynamic_cast 动态转换 5. 重点-深入理解下reinter...
static_cast";n=static_cast<int>(3.14);// n 的值变为 3n=static_cast<int>(a);// 调用 a.operator int, n 的值变为 1p=static_cast<char*>(a);// 调用 a.operator char*,p 的值变为 NULL// n = static_cast <int> (p); // 编译错误,static_cast不能将指针转换成整型// p = ...
static_cast(见上文),然后const_cast reinterpret_cast reinterpret_cast,然后const_cast 因此,在某些情况下,它可以用作其他演员表的替代品,但由于能够演变为reinterpret_cast,因此可能非常危险,并且在需要显式转换时应首选后者,除非您确定static_cast会成功或reinterpret_cast会失败。即便如此,考虑更长、更明确的选项。
static_cast主要用于基本类型的转换和派生类到基类的转换。例如,从int到double的转换,或者从派生类对象到基类指针的转换。使用static_cast时,编译器会检查转换的正确性,如果转换是合法的,则编译通过;如果转换可能导致数据丢失或未定义的行为,则编译器会报错。这种类型的转换通常用于安全的类型转换。rein...
在C++中,有四种类型转换运算符:static_cast、dynamic_cast、const_cast和reinterpret_cast。 1. static_cast: 用途:主要用于基本数据类型和非多态类之间的转换,以及父子类之间指针或引用的转换。 限制:不能用于非多态类与多态类之间的转换,也不能用于不相关类型之间的转换。
1 static_cast 用法:static_cast < type-id > ( exdivssion ) 该运算符把exdivssion转换为type-id类型,但没有运行时类型检查来保证转换的安全性。它主要有如下几种用法: ①用于类层次结构中基类和子类之间指针或引用的转换。 进行上行转换(把子类的指针或引用转换成基类表示)是安全的; ...
static_cast可以视为C语言强制类型转换的替代品。6.4、reinterpret_cast用于将一种类型转换为另一种不同的类型。它可以将整型转换为指针,或将指针转换为整型。然而,这种转换是危险的,因为它会改变数据的解释方式,可能导致未定义行为。因此,通常不建议使用reinterpret_cast。