• 【c++11特性】——static_cast,dynamic_cast,const_cast,reinterpret_cast解析


    目录

    1.static_cast

    2.dynamic_cast

    dynamic_cast为什么只能用于具有虚函数的类?

    3.const_cast

    4.reinterpret_cast

    reinterpret_cast 的作用

    static_cast 和dynamic_cast的区别?


    1.static_cast

    概念

    static_cast 是C++中的一种类型转换运算符,用于执行编译时的类型转换。它通常用于在编译时进行类型转换,而不进行运行时的检查。

    static_cast 可以用于以下几种常见的类型转换:

    1.基本数据类型的转换

    static_cast 可以用于执行基本数据类型之间的转换,例如将整数转换为浮点数,反之亦然。

    1. int integer = 42;
    2. double floating = static_cast<double>(integer);

    2.指针类型的转换

    static_cast 可以用于执行指针类型之间的转换,但它通常不进行运行时检查。因此,你需要确保转换是安全的

    1. Parent* parentPtr = new Child;
    2. Child* childPtr = static_cast(parentPtr);

    如果你尝试将一个指向一个类的基类的指针转换为指向一个派生类的指针,但实际上该对象并不是派生类的实例,那么这个转换是不安全的。

    1. class Base {};
    2. class Derived {};
    3. Base* basePtr = new Base;
    4. Derived* derivedPtr = static_cast(basePtr); // 不安全

    在这种情况下,由于对象实际上不是 Derived 类的实例,这个转换会导致未定义的行为。

    3.类层次结构中的向上转换

    当你有一个指向派生类对象的指针,但需要将其转换为基类指针时,可以使用 static_cast 进行向上转换

    1. Child* childPtr = new Child;
    2. Parent* parentPtr = static_cast(childPtr);

    2.dynamic_cast

    dynamic_cast 是C++中的一种类型转换运算符,主要用于在类继承层次结构中执行安全的向上或向下类型转换,并进行运行时类型检查,dynamic_cast只能用于具有虚函数的类

    作用:

    安全的向下转换

    1. 当你有一个指向基类对象的指针或引用,但知道它实际上指向了某个派生类的对象时,可以使用 dynamic_cast 进行向下转换。它会在运行时进行类型检查,以确保转换是安全的。
    2. 如果基类指针或引用不指向派生类的对象,进行向下转换的时候,dynamic_cast 将返回 nullptr(对于指针),引发 std::bad_cast 异常(对于引用)
    1. class Base {};
    2. class Derived : public Base {};
    3. Base* basePtr = new Derived;
    4. Derived* derivedPtr = dynamic_cast(basePtr);
    5. if (derivedPtr) {
    6. // 转换成功,可以安全地使用 derivedPtr
    7. } else {
    8. // 转换失败
    9. }

     

    运行时类型检查

    dynamic_cast 执行类型转换时会执行运行时类型检查确保对象的实际类型与所请求的类型匹配。如果类型不匹配,它会返回一个空指针(对于指针类型)或引发 std::bad_cast 异常(对于引用类型)。可以避免不正确的类型转换,提高了程序的健壮性。

    以下是 dynamic_cast 的基本用法:

    1. class Base {
    2. public:
    3. virtual ~Base() {}
    4. };
    5. class Derived : public Base {
    6. public:
    7. void derivedFunction() {
    8. // 派生类特有的函数
    9. }
    10. };
    11. int main() {
    12. Base* basePtr = new Derived;
    13. Derived* derivedPtr = dynamic_cast(basePtr);
    14. if (derivedPtr) {
    15. // 转换成功,可以安全地访问派生类成员
    16. derivedPtr->derivedFunction();
    17. } else {
    18. // 转换失败
    19. }
    20. delete basePtr;
    21. return 0;
    22. }

    dynamic_cast为什么只能用于具有虚函数的类?

    • dynamic_cast 是一种在运行时执行类型检查的机制。它需要知道对象的实际类型,以便进行安全的类型转换
    • 每个具有虚函数的类都有一个虚函数表,其中存储了指向各种虚函数的指针,这个虚函数表允许在运行时查找对象的实际类型

    总结:在运行的时候通过虚函数表指针去判断对象的实际类型

    3.const_cast

    const_cast 是C++中的一种类型转换运算符,它用于添加或删除对象的 const 限定符,以便在一定条件下进行类型转换。

    作用:

    1.去除 const 限定符

    最常见的用途是用于const 类型的指针或引用转换为非 const 类型,这可以允许修改本来是 const 的对象,但需要小心使用,因为它可能会导致不一致的行为。

    1. const int x = 42;
    2. int* ptr = const_cast<int*>(&x);
    3. *ptr = 55; // 可以修改 x,但是这是不推荐的

    出现不一致的行为:

    违反设计约定:在一些程序设计中,使用 const 是一种约定,用于表示某个对象应该被视为不可变。如果违反了这种约定,可能会导致程序中的错误。

    2.添加 const 限定符

    可以将非 const 类型的指针或引用转换为 const 类型,这通常用于传递对象的只读引用或指针,以防止在函数内部修改对象。

    1. int y = 10;
    2. const int* constPtr = const_cast<const int*>(&y);

    4.reinterpret_cast

    概念:

    reinterpret_cast 是C++中的一种类型转换运算符,用于进行低级别的类型转换,通常用于不同类型之间的转换,或将整数值视为指针reinterpret_cast 非常强大,但也非常危险,因为它不进行类型检查。

    reinterpret_cast 的作用

    1.指针之间的转换

    reinterpret_cast 可以用于将一个指针类型转换为另一个指针类型,即使它们之间没有继承关系。

    1. int value = 42;
    2. double* doublePtr = reinterpret_cast<double*>(&value);

    这个转换不会执行任何类型检查,因此需要确保转换是安全的。 

    2.整数和指针之间的转换

    reinterpret_cast 还可以用于将整数值转换为指针,或将指针转换为整数值。这通常用于底层编程或处理硬件接口

    1. int integer = 42;
    2. void* voidPtr = reinterpret_cast<void*>(integer);

    3.不同类型的指针之间的转换

    有时需要将一个类型的指针转换为另一个类型的指针,但要注意这可能会导致未定义的行为,因为它假设了特定的内存布局。

    1. struct A { int x; };
    2. struct B { double y; };
    3. A* aPtr = new A;
    4. B* bPtr = reinterpret_cast(aPtr); // 潜在的未定义行为

    static_cast 和dynamic_cast的区别?

    1.类型转换的时期

    • static_cast 是在编译时执行的类型转换
    • dynamic_cast 是在运行时执行的类型转换。它进行运行时类型检查,确保转换是安全的

    2.安全性

    • static_cast 向下转换不安全:一个指向一个基类的指针转换为指向一个派生类的指针,但实际上该对象并不是派生类的实例,那么这个转换是不安全的
    • dynamic_cast 向下转换安全:运行的时候会检查如果基类指针或引用不指向派生类的对象,进行向下转换的时候,dynamic_cast 将返回 nullptr(对于指针),引发 std::bad_cast 异常(对于引用)

    3.适用范围

    • static_cast适用非多态类型的转换,基本数据类型之间的转换,指针类型之间的转换
    • dynamic_cast 主要用于处理多态类型之间的转换,对象必须包含至少一个虚函数
  • 相关阅读:
    python基础语法回顾
    Websocket在Java中的实践——最小可行案例
    js基础笔记学习199正则表达式简介2
    深入理解JVM - 内存区域介绍(抄录整理)
    保卫城市消费券安全,从这些做起
    三万字带你了解那些年面过的Java八股文
    【分布式技术专题】「分布式技术架构」MySQL数据同步到Elasticsearch之N种方案解析,实现高效数据同步
    美国将采取新政策降低对中国大陆的依赖 | 百能云芯
    如何理解UDP和TCP的区别
    flaks框架学习:在 URL 中添加变量
  • 原文地址:https://blog.csdn.net/sjp11/article/details/133554629