reinterpret_cast

C++ static_cast

社会主义新天地 提交于 2020-03-30 12:07:01
static_cast 编辑 该运算符把expression转换为type-id类型,但没有运行时类型检查来保证转换的安全性。 中文名 暂无 外文名 static_cast 分 类 强制类型转换 类 型 C++ static_cast 目录 1 用法 2 简介 用法 编辑 static_cast < type-id > ( expression ) 简介 编辑 该运算符把expression转换为type-id类型,但没有运行时类型检查来保证转换的安全性。它主要有如下几种用法: ①用于 类层次结构 中基类(父类)和 派生类 (子类)之间指针或引用的转换。 进行上行转换(把派生类的指针或引用转换成基类表示)是安全的; 进行下行转换(把基类指针或引用转换成派生类表示)时,由于没有动态类型检查,所以是不安全的。 ②用于基本数据类型之间的转换,如把int转换成char,把int转换成enum。这种转换的安全性也要开发人员来保证。 ③把空指针转换成目标类型的空指针。 ④把任何类型的表达式转换成void类型。 注意:static_cast不能转换掉expression的const、volatile、或者__unaligned属性。 C++中static_cast和 reinterpret_cast 的区别 C++primer 第四版第五章里写了 编译器 隐式执行任何 类型转换

C++标准转换运算符reinterpret_cast

*爱你&永不变心* 提交于 2020-03-08 08:34:51
C++标准转换运算符reinterpret_cast 来源 https://www.cnblogs.com/codingmengmeng/p/7650885.html reinterpret_cast<new_type> (expression) reinterpret_cast运算符是用来处理无关类型之间的转换;它会产生一个新的值,这个值会有与原始参数(expression)有完全相同的比特位。 什么是无关类型?我没有弄清楚,没有找到好的文档来说明类型之间到底都有些什么关系(除了类的继承以外)。后半句倒是看出了reinterpret_cast的字面意思:重新解释(类型的比特位)。我们真的可以随意将一个类型值的比特位交给另一个类型作为它的值吗?其实不然。 IBM的C++指南里倒是明确告诉了我们reinterpret_cast可以,或者说应该在什么地方用来转换运算符: 从指针类型到一个足够大的整数类型 从整数类型或者枚举类型到指针类型 从一个指向函数的指针到另一个不同类型的指向函数的指针 从一个指向对象的指针到另一个不同类型的指向对象的指针 从一个指向类函数成员的指针到另一个指向不同类型的函数成员的指针 从一个指向类数据成员的指针到另一个指向不同类型的数据成员的指针 不过我在Xcode中测试了一下,事实上reinterpret_cast的使用并不局限在上边所说的几项的

C++中四种强制类型转换区别详解

情到浓时终转凉″ 提交于 2020-03-02 13:22:19
 C++即支持C风格的类型转换,又有自己风格的类型转换。C风格的转换格式很简单,但是有不少缺点的:   1.转换太过随意,可以在任意类型之间转换。你可以把一个指向const对象的指针转换成指向非const对象的指针,把一个指向基类对象的指针转换成一个派生类对象的指针,这些转换之间的差距是非常巨大的,但是传统的C语言风格的类型转换没有区分这些。   2.C风格的转换没有统一的关键字和标示符。对于大型系统,做代码排查时容易遗漏和忽略。   C++风格完美的解决了上面两个问题。1.对类型转换做了细分,提供了四种不同类型转换,以支持不同需求的转换;2.类型转换有了统一的标示符,利于代码排查和检视。下面分别来介绍这四种转换:static_cast、dynamic_cast、const_cast和reinterpre_cast. 一、static_cast转换   1.基本用法:static_cast<type-id> expression   2.使用场景:   a、用于类层次结构中基类和派生类之间指针或引用的转换   上行转换(派生类---->基类)是安全的;   下行转换(基类---->派生类)由于没有动态类型检查,所以是不安全的。   b、用于基本数据类型之间的转换,如把int转换为char,这种带来安全性问题由程序员来保证   c、把空指针转换成目标类型的空指针   d

C++的强制类型转换

拜拜、爱过 提交于 2020-02-28 19:18:08
c/c++强制类型转换 Q:什么是C风格转换?什么是static_cast, dynamic_cast 以及 reinterpret_cast?区别是什么?为什么要注意? A:转换的含义是通过改变一个变量的类型为别的类型从而改变该变量的表示方式。为了类型转换一个简单对象为另一个对象你会使用传统的类型转换操作符。比如,为了转换一个类型为doubole的浮点数的指针到整型: 代码: int i; double d; i = (int) d;或者:i = int (d); 对于具有标准定义转换的简单类型而言工作的很好。然而,这样的转换符也能不分皂白的应用于类(class)和类的指针。ANSI-C++标准定义了四个新的转换符:'reinterpret_cast', 'static_cast', 'dynamic_cast' 和 'const_cast',目的在于控制类(class)之间的类型转换。 代码: reinterpret_cast<new_type>(expression) dynamic_cast<new_type>(expression) static_cast<new_type>(expression) const_cast<new_type>(expression) 1 reinterpret_cast reinterpret_cast 转换一个指针为其它类型的指针

什么时候使用reinterpret_cast?

别来无恙 提交于 2020-02-28 06:51:38
我对 reinterpret_cast 和 static_cast 的适用性不感到困惑。 从我所读的内容中,一般规则是在编译时可以解释类型的情况下使用static强制转换,因此单词 static 。 这是C ++编译器内部也用于隐式强制转换的强制转换。 reinterpret_cast 适用于两种情况: 将整数类型转换为指针类型,反之亦然 将一种指针类型转换为另一种。 我得到的一般想法是,这是不可移植的,应该避免。 我有点困惑的是我需要的一种用法,我从C调用C ++,C代码需要保留在C ++对象上,因此基本上它包含 void* 。 应该使用哪种强制转换在 void * 和Class类型之间进行转换? 我看过 static_cast 和 reinterpret_cast 用法吗? 虽然从我所读的内容来看, static 似乎更好,因为强制转换可以在编译时进行? 尽管它说使用 reinterpret_cast 从一种指针类型转换为另一种指针类型? #1楼 template <class outType, class inType> outType safe_cast(inType pointer) { void* temp = static_cast<void*>(pointer); return static_cast<outType>(temp); }

C++语言里const_cast 在可变与不可变类型之间转换一、常量指针被转化成非常量指针,并且仍然指向原来的对象;

可紊 提交于 2020-02-19 13:45:21
在C语言里强制类型转换的方法非常简单,只要在要转换的变量前用括号确定要转换的类型即可,如要将一个double型的变量强制转换为int类型,代码如下: double x = 3.14; int y = (int)x; 另外,还可有更高级的转换,如把int *类型的变量转换为int ,代码如下: int x = 20; int *p = &x; int y = (int)p; 在C++语言里为了让强制类型转换更明显,更安全,所以把不同情况下的强制类型转换分为四种,分别为: static_cast 静态类型转换,属于最安全的强制类型转换。 const_cast 在可变与不可变类型之间转换 dynamic_cast 在多态的情况下,父子类之间的转换 reinterpret_cast 所有类型间的转换,最不安全的转换 1. C++中的 static_cast 执行非多态的转换,用于代替C中通常的转换操作。因此,被做为隐式类型转换使用。比如:   int i;   float f = 166.7f;   i = static_cast <int>(f);   此时结果,i的值为166。 2. C++中的 reinterpret_cast 主要是将数据从一种类型的转换为另一种类型。所谓“通常为操作数的位模式提供较低层的重新解释”也就是说将数据以二进制存在形式的重新解释。比如:   int i;

C++ reinterpret_cast

≡放荡痞女 提交于 2020-01-31 04:32:29
C++ reinterpret_cast reinterpret_cast 參考連結 reinterpret_cast reinterpret_cast 用於將某種類型的指標強行轉換為另一種類型的指標。因為它不會做類型檢查,所以與 static_cast 比起來,它是較為危險的。 在 TensorRT/blob/master/samples/common/common.h 的函數 readPGMFile 中: inline void readPGMFile ( const std :: string & fileName , uint8_t * buffer , int inH , int inW ) { //... infile . read ( reinterpret_cast < char * > ( buffer ) , inH * inW ) ; } 將 uint8_t* 型別的指標強行轉為 char* 型別的指標。 其中的 uint8_t 是一個在C99標準中,使用 typedef 定義於 stdint.h 的型別: typedef unsigned char uint8_t ; typedef unsigned short uint16_t ; typedef unsigned long uint32_t ; typedef unsigned long long

static_cast、const_cast和reinterpret_cast学习

蓝咒 提交于 2020-01-10 03:35:25
static_cast   任何具有明确定义的类型转换,只要不包含底层const,都可以使用static_cast。例如,通过将一个运算对象强制转换成double类型就能表达式浮点数除法: //进行强制类型转换以便执行浮点数处罚 double slope = static_cast<double>(j)/i;   当需要把一个较大的算术类型赋值给较小的类型时,static_cast非常有用。此时,强制类型转换告诉程序的读者和编译器:我们知道并且不在乎潜在的精度损失。一般来说,如果编译器发现一个较大的算术类型试图赋值给较小的类型,就会给出警告信息;但是当我们执行了显式的类型转换后,警告信息就会被关闭了。   static_cast对于编译器无法自动执行的类型转换也非常有用。例如我们可以使用static_cast找回存在于void*指针中的值: void *p=&d;//正确:任何非常量对象的地址都能存入void* //正确:将void*转换回初始的指针类型 double *dp=static_cast<double*>(p);   当我们把指针存放在void*中,并且使用static_cast将其强制转换回原来的类型时,应该确保指针转换后所得的类型就是指针所指的类型。类型一旦不符,将产生未定义的后果。 const_cast   const_cast只能改变运算对象的底层const

static_cast、const_cast和reinterpret_cast学习

浪子不回头ぞ 提交于 2020-01-04 05:40:13
static_cast   任何具有明确定义的类型转换,只要不包含底层const,都可以使用static_cast。例如,通过将一个运算对象强制转换成double类型就能表达式浮点数除法: //进行强制类型转换以便执行浮点数处罚 double slope = static_cast<double>(j)/i;   当需要把一个较大的算术类型赋值给较小的类型时,static_cast非常有用。此时,强制类型转换告诉程序的读者和编译器:我们知道并且不在乎潜在的精度损失。一般来说,如果编译器发现一个较大的算术类型试图赋值给较小的类型,就会给出警告信息;但是当我们执行了显式的类型转换后,警告信息就会被关闭了。   static_cast对于编译器无法自动执行的类型转换也非常有用。例如我们可以使用static_cast找回存在于void*指针中的值: void *p=&d;//正确:任何非常量对象的地址都能存入void* //正确:将void*转换回初始的指针类型 double *dp=static_cast<double*>(p);   当我们把指针存放在void*中,并且使用static_cast将其强制转换回原来的类型时,应该确保指针转换后所得的类型就是指针所指的类型。类型一旦不符,将产生未定义的后果。 const_cast   const_cast只能改变运算对象的底层const

C++四种类型之间的转换

浪子不回头ぞ 提交于 2019-12-24 04:07:16
C风格的强制类型转换(Type Cast)很简单,不管什么类型的转换统统是: TYPE b = (TYPE)a。 C++风格的类型转换提供了4种类型转换操作符来应对不同场合的应用。 const_cast,字面上理解就是去const属性。 static_cast,命名上理解是静态类型转换。如int转换成char。 dynamic_cast,命名上理解是动态类型转换。如子类和父类之间的多态类型转换。 reinterpret_cast,仅仅重新解释类型,但没有进行二进制的转换。 4种类型转换的格式,如:TYPE B = static_cast(TYPE)(a)。 const_cast 去掉类型的const或volatile属性。 struct SA { int i; }; const SA ra; //ra.i = 10; //直接修改const类型,编译错误 SA &rb = const_cast<SA&>(ra); rb.i =10; static_cast 类似于C风格的强制转换。无条件转换,静态类型转换。用于: 1. 基类和子类之间转换:其中子类指针转换成父类指针是安全的;但父类指针转换成子类指针是不安全的。(基类和子类之间的动态类型转换建议用dynamic_cast) 2. 基本数据类型转换。enum, struct, int, char, float等。static