类型转换const_cast/static_cast/dynamic_cast/reinterpret_cast

简介: 类型转换const_cast/static_cast/dynamic_cast/reinterpret_cast

解决问题

主要是针对C语言中的类型隐形转换以及手动转换,C++提供了四种机制全部用来手动转换添加了4个关键字,解决C中的强转的风险,提高代码的安全性和健壮性

取消类型的const或volatile属性

将const转成非const。主要针对的是指针,引用,this指针;普通的变量无法使用.

const int n = 10;
        //int k = const_cast<int>(n); //编译不通过
        int* j = const_cast<int*>(&n);
        int& i = const_cast<int&>(n);
        std::cout << *j  << " " << i << std::endl;

static_cast

无条件转换,静态类型转换

第一种用法:

int n = 5;
float = f = 10.0f;
f = n; //编译器默认会给你转换

编译器帮你做了转换,不好查询问题;而c++提供了static_cast转换,手动的转换关键字,代码层面更加直观。

f = static_cast<float>(n);

第二种用法:

子类与基类的转换。

父类转子类 不安全,但是编译可能也通过

子类转基类 可以转

dynamic_cast

有条件转换,动态类型转换,运行时检测

使用此关键字必须基类有虚函数,且基类与派生类之间指针与引用关联。

Base b;
        Base* pb = &b;
        Sub s;
        Sub* ps = &s;
        // 子转父
        //pb = ps;
        // 父转子 不安全,只有在程序运行的时候才能发现,
        //希望有一种机制能检测转换不安全,而不是程序出现问题后才能发现
        //ps = pb;
        //dynamic_cast机制 有额外的开销,引入RTTI,一般只有向下转才会使用
        //ps = dynamic_cast<Sub*>(pb);
        //pb = dynamic_cast<Base*>(ps);

reinterpret_cast

等价与C语言中的强转

int n = 1;
int *p = (int*)n;
int *p = n;

C++提供一种统一的强转类型

int *p = reinterpret_cast<int*>(n);

可读性更好,适用于各种高危型的转换方式;整数转换指针,各种类型转换指针转换,父子类转换不做检测

目录
相关文章
|
4月前
|
安全 程序员 编译器
static_cast与dynamic_cast到底是什么?
该文讨论C++中`static_cast`和`dynamic_cast`在处理子类与父类指针转换的情况。总结如下: 1. `static_cast`父类转子类:可能不安全,但不会报错。 2. `static_cast`子类转父类:安全,无错误。 3. `dynamic_cast`父类转子类:若父类有虚函数,运行时检查,成功返回子类指针,失败则为`nullptr`。 4. `dynamic_cast`子类转父类:安全,无错误。
|
5月前
|
安全 编译器 程序员
【C++入门到精通】C++类型的转换 | static_cast | reinterpret_cast | const_cast | dynamic_cast [ C++入门 ]
【C++入门到精通】C++类型的转换 | static_cast | reinterpret_cast | const_cast | dynamic_cast [ C++入门 ]
36 0
|
5月前
|
安全 编译器 C语言
【C++ 类型转换关键字 *_cast 】理解const_cast、reinterpret_cast、dynamic_cast和static_cast的用法
【C++ 类型转换关键字 *_cast 】理解const_cast、reinterpret_cast、dynamic_cast和static_cast的用法
65 0
|
5月前
|
C++
[C++] 强制类型转换(dynamic_cast和dynamic_Pointer_cast)
[C++] 强制类型转换(dynamic_cast和dynamic_Pointer_cast)
88 1
|
5月前
|
安全 编译器 程序员
[C++ 从入门到精通] 6.static_cast、dynamic_cast等显示类型转换
[C++ 从入门到精通] 6.static_cast、dynamic_cast等显示类型转换
74 0
|
安全 C++
C++11之强制类型转换(static_cast,const_cast,dynamic_cast,reinterpret_cast)
C++11之强制类型转换(static_cast,const_cast,dynamic_cast,reinterpret_cast)
107 0
|
安全 C++ 编译器
static_cast, dynamic_cast, const_cast探讨
首先回顾一下C++类型转换: C++类型转换分为:隐式类型转换和显式类型转换 第1部分. 隐式类型转换 何时发生隐式类型转换 在下面这些情况下,编译器会自动地转换运算对象的类型: 在大多数表达式中,比int类型小的整型值首先提升为较大的整数类型 在条件中,非布尔值转换为布尔类型 ...
1127 0