zoukankan
html css js c++ java
总结C++中的所有强制转换函数(const_cast,reinterpret_cast,static_cast,dynamic_cast)(转载)
标准c++中主要有四种强制转换类型运算符:
const_cast
,
reinterpret_cast
,
static_cast
,
dynamic_cast
等等。
1)
static_cast
<T*>(a)
将地址a转换成类型T,T和a必须是指针、引用、算术类型或枚举类型。
表达式
static_cast
<T*>(a), a的值转换为模板中指定的类型T。在运行时转换过程中,不进行类型检查来确保转换的安全性。
例子:
class
B { ... };
class
D :
public
B { ... };
void
f(B* pb, D* pd)
{
D* pd2 =
static_cast
<D*>(pb);
// 不安全, pb可能只是B的指针
B* pb2 =
static_cast
<B*>(pd);
// 安全的
...
}
class
B { ... };
class
D :
public
B { ... };
void
f(B* pb, D* pd)
{
D* pd2 =
static_cast
<D*>(pb);
// 不安全, pb可能只是B的指针
B* pb2 =
static_cast
<B*>(pd);
// 安全的
...
}
class
B { ... };
class
D :
public
B { ... };
void
f(B* pb, D* pd)
{
D* pd2 =
static_cast
<D*>(pb);
// 不安全, pb可能只是B的指针
B* pb2 =
static_cast
<B*>(pd);
// 安全的
...
}
2)
dynamic_cast
<T*>(a)
完成类层次结构中的提升。T必须是一个指针、引用或无类型的指针。a必须是决定一个指针或引用的表达式。
表达式
dynamic_cast
<T*>(a) 将a值转换为类型为T的对象指针。如果类型T不是a的某个基类型,该操作将返回一个空指针。
例子:
class
A { ... };
class
B { ... };
void
f()
{
A* pa =
new
A;
B* pb =
new
B;
void
* pv =
dynamic_cast
<A*>(pa);
// pv 现在指向了一个类型为A的对象
...
pv =
dynamic_cast
<B*>(pb);
// pv 现在指向了一个类型为B的对象
}
3)
const_cast
<T*>(a)
去掉类型中的常量,除了
const
或不稳定的变址数,T和a必须是相同的类型。
表达式
const_cast
<T*>(a)被用于从一个类中去除以下这些属性:
const
,
volatile
, 和 __unaligned。
例子:
class
A { ... };
void
f()
{
const
A *pa =
new
A;
//const对象
A *pb;
//非const对象
//pb = pa; // 这里将出错,不能将const对象指针赋值给非const对象
pb =
const_cast
<A*>(pa);
// 现在OK了
...
}
class
A { ... };
void
f()
{
const
A *pa =
new
A;
//const对象
A *pb;
//非const对象
//pb = pa; // 这里将出错,不能将const对象指针赋值给非const对象
pb =
const_cast
<A*>(pa);
// 现在OK了
...
}
class
A { ... };
void
f()
{
const
A *pa =
new
A;
//const对象
A *pb;
//非const对象
//pb = pa; // 这里将出错,不能将const对象指针赋值给非const对象
pb =
const_cast
<A*>(pa);
// 现在OK了
...
}
4)
reinterpret_cast
<T*>(a)
任何指针都可以转换成其它类型的指针,T必须是一个指针、引用、算术类型、指向函数的指针或指向一个类成员的指针。
表达式
reinterpret_cast
<T*>(a)能够用于诸如
char
* 到
int
*,或者One_class* 到 Unrelated_class*等类似这样的转换,因此可能是不安全的。
例子:
class
A { ... };
class
B { ... };
void
f()
{
A* pa =
new
A;
void
* pv =
reinterpret_cast
<A*>(pa);
// pv 现在指向了一个类型为B的对象,这可能是不安全的
...
}
查看全文
相关阅读:
Epox 8RDA3G主板奇怪的问题
Dreamweaver自动生成的垃圾代码
于今天完成NGW作业
C#中WebBrowser的使用
解决FC3下默认浏览器无法出来的问题
开了几个小时的会……
HappyEO电子琴
又一个周末
FC2/FC3下无法使用Midi设备
Blog正式易名“小生杂谈”
原文地址:https://www.cnblogs.com/goodcandle/p/1413907.html
最新文章
C# 1.x 实现 "强类型元素唯一的 ArrayList"
Java: Too Simple Hibernate Sample with Ms SQL Server
求日期所属星座的 TSQL UDF (用户自定义函数)
验证有效 "日期时间" 的正则表达式(已解决闰二月)
数据结构之应用 "栈(Stack)" 实现: 解析算术表达式及计算求值 (C#/Java)
.Net/C# 应用程序直接读取本地 Cookies 文件 (由于 WinXP SP2 调用 API: InternetGetCookie 无果)
用于执行(计算) "字符串表达式" 的 TSQL 存储过程
实现支持文件分块多点异步上传的 Web Services 及其客户端(非Web)应用程序调用相关异步执行的 Web Method
AjaxPro使用说明
C#反射在实际应用中的事例代码
热门文章
在一个js文件中引入另一个js文件
30分钟LINQ教程
UML建模系列文章总结
介绍三种Session存储方式
全球前40位最大医疗器械公司排名
C#自定义Attribute略谈
Microsoft Asp.Net Ajax框架入门(10) ScriptManager, UpdatePanel, Timer
C#索引器简单示例
本周规划
人在异乡
Copyright © 2011-2022 走看看