static_cast揭密

news/2024/8/26 18:24:43
static_cast揭密
本文讨论static_cast<> 和 reinterpret_cast<>。

介绍
大多程序员在学C++前都学过C,并且习惯于C风格(类型)转换。当写C++(程序)时,有时候我 们在使用static_cast<>和reinterpret_cast<>时可能会有点模糊。在本文中,我将说明 static_cast<>实际上做了什么,并且指出一些将会导致错误的情况。

泛型(Generic Types)

         float f = 12.3;

         float* pf = &f;
      

// static cast<>

         // 成功编译, n = 12

         int n = static_cast<int>(f);

         // 错误,指向的类型是无关的(译注:即指针变量pf是float类型,现在要被转换为int类型)
         //int* pn = static_cast<int*>(pf);

         //成功编译

         void* pv = static_cast<void*>(pf);

         //成功编译, 但是 *pn2是无意义的内存(rubbish)

         int* pn2 = static_cast<int*>(pv);


      

// reinterpret_cast<>

         //错误,编译器知道你应该调用static_cast<>

         //int i = reinterpret_cast<int>(f);

         //成功编译, 但是 *pn 实际上是无意义的内存,和 *pn2一样

         int* pi = reinterpret_cast<int*>(pf);

简而言之,static_cast<> 将尝试转换,举例来说,如float-到-integer,而reinterpret_cast<>简单改变编译器的意图重新考虑那个对象作为另一类型。

指针类型(Pointer Types)

指针转换有点复杂,我们将在本文的剩余部分使用下面的类:

class CBaseX

       {

       public:

       int x;

       CBaseX() { x = 10; }

       void foo() { printf("CBaseX::foo() x=%d/n", x); }

       };
      

class CBaseY

         {

         public:

         int y;

         int* py;

         CBaseY() { y = 20; py = &y; }

         void bar() { printf("CBaseY::bar() y=%d, *py=%d/n", y, *py);
         }

         };


      

class CDerived : public CBaseX, public CBaseY

         {

         public:

         int z;

         };

情况1:两个无关的类之间的转换

       // Convert between CBaseX* and CBaseY*

       // CBaseX* 和 CBaseY*之间的转换

       CBaseX* pX = new CBaseX();

       // Error, types pointed to are unrelated
 
 

http://www.niftyadmin.cn/n/1996044.html

相关文章

POI操作Excel一些中文问题的解决方法

1. 设置工作表名 &#xff08;下文中提到的workbook为类org.apache.poi.hssf.usermodel.HSSFWorkbook的一个实例&#xff09; 如果使用workbook.createSheet(sheetname)或者使用workbook.setSheetName(1, "中文")&#xff0c;默认会使用ENCODING_COMPRESSED_U…

02-CSS基础与进阶-day9_2018-09-12-21-27-10

z-index 当对多个元素设置定位时,重叠的定位元素可以通过z-index调整堆叠顺序 其值可以为0 正数 负数 特点 1 z-index默认值为0 取值越大 定位元素在层叠元素上越局上 2 z-index取值一样&#xff0c;后来居上 3 z-index值不能加单位 4 只有定位元素才有该属性&#xff0c;其余如…

讨论static_cast 和 reinterpret_cast

讨论static_cast 和 reinterpret_cast 作者&#xff1a;Sam NG 译者&#xff1a;小刀人 原文链接&#xff1a;What static_cast<> is actually doing 本文讨论static_cast<> 和 reinterpret_cast<>。 介绍大 多程序员在学C前都学过C&#xff0c;并且…

awk调用date命令

创建文件date.awk&#xff1a; $8 107582685 { cmd "date %Y-%m-%d-%H -d \"" $11 "\""while (cmd | getline line) {print line}close(cmd)} 调用命令: awk -f date.awk *.log | sort | uniq -dc | sort -nr sort参数: -n // 以数值来排…

VC6调用WebService

VC6调用WebService 作者&#xff1a;未知 来源&#xff1a;月光软件站 加入时间&#xff1a;2005-2-28 月光软件站 下面是个控制台的样例Toolkit3.0 终于给出VC6的样例了&#xff0c;1.0只能看到VB和ASP的 #include <stdio.h> #import "msxml4.dll" using…

Jakata Poi HSSF:纯java的Excel解决方案

Jakata Poi HSSF&#xff1a;纯java的Excel解决方案JCoder 转贴 (参与分&#xff1a;32257&#xff0c;专家分&#xff1a;1325) 发表&#xff1a;2005-07-15 15:57 版本&#xff1a;1.0 阅读&#xff1a;2121次 微软在桌面系统上的成功&#xff0c;令我们不得不大量使…

HTML5五大特性

DNS Prefetching、Link Prefetching、Download属性、Regular Expressions以及Datalist元素 1. DNS PrefetchingDNS主机名解析有时会出现拖慢网站速度的问题。现代浏览器当遇到DNS解析时已经十分聪明——用户在跟随某个链接之前&#xff0c;浏览器先尝试解析域名再将其进行缓存…

多词查询(Multi-word Queries)

如果我们一次只能搜索一个词&#xff0c;那么全文搜索就会显得相当不灵活。幸运的是&#xff0c;通过match查询来实现多词查询也同样简单&#xff1a; GET /my_index/my_type/_search {"query": {"match": { "title": "BROWN DOG!" } …