C++强制类型转换
来源:互联网 发布:数据访问框架 编辑:程序博客网 时间:2024/05/14 10:49
先后看过几次关于C++类型转换的资料,甚至还用过几次,可对其了解还是很模糊,本次特别予以总结。不是随便写的,真的是用心写的,姑且看吧。
C++命名的强制类型转换也称作新式类型转换,也是C语言类型转换的一个演进。
看一个C语言的类型转换:
1
char
*hopeItWorks = (
char
*)0x00ff0000;
C++的类型转换其实把C语言类型转换细分了一下,一分为四。(当然,同时兼容老式类型转换)
1、const_cast
该操作符允许添加或移除表达式中类型的const或volatile修饰符:
1
const
Person *getEmployee()
2
{
3
// do some thing and return const Person *
4
}
5
Person *anEmployee =
const_cast
<Person *>(getEmployee());
// C++类型转换
6
Person *anEmployee = (Person *)getEmployee();
// C类型转换
1
const
Employee *getEmployee()
// 返回类型变了
2
{
3
// do some thing and return const Employee *
4
}
5
Person *anEmployee =
const_cast
<Person *>(getEmployee());
// C++类型转换,编译提示错误
6
Person *anEmployee = (Person *)getEmployee();
// C类型转换,编译不提示错误
这里函数返回类型发生改变,在const_cast试图将const Employee * 转换为Employee *时就已经超出了其能力范围,会在编译阶段给出提示,这往往是很有用的,当然,C++可以做到能力更强的类型转换,且向下看。
2、static_cast
编译器隐式执行的任何类型转换都可以由static_cast显式完成:
1
double
d = 97.0
2
char
ch =
static_cast
<
char
>d;
//没有编译告警
静态转换常用于基类的指针或引用,转型为一个派生类的指针为引用。
需要注意的是这不是一个非常安全的转换,损失的精度需要程序员去考虑。使用此转换的一个考虑是:可跨平台移植。
3、reinterpret_cast
顾名思义,重新解释。它从位(bit)的角度来看待一个对象,从而允许将一个东西看作另一个完全不同的东西:
1
char
*hopeItWorks =
reinterpret_cast
<
char
*>(0x00ff0000);
// 把int假装成指针
2
int
*hopeless =
reinterpret_cast
<
int
*>(hopeItWorks);
//把char *假装成int *
给出一种几乎是错误的转换:
1
int
*ip;
2
char
*pc =
reinterpret_cast
<
char
*>(ip);
3
std::string str(pc);
// 使用pc初始化一个string 对象,很可能出现运行时错误
4、dynamic_cast
顾名思义,动态的转换。大家知道,C++是具有多态特性的,该种转换仅用于对多态类型进行向下转型(也就是说,被转型的表达式的类型,必须是一个指向带有虚函数的类类型的指针)。上面讲的static_cast也可以从基类指换到派生类,但是不安全的。dynamic_cast执行运行期检查工作,来判定转型的正常性,当然是要会出代价的,好比,多态性也会带来性能开销一样。
01
const
Shape *getNextShape()
02
{
03
// do some thing and return const Shape *
04
}
05
const
Circle *cp =
dynamic_cast
<
const
Circle *>(getNextShape());
06
if
(cp)
07
{
08
...
09
}
10
注: Circle类派生于Shape类。
至此,C++四种转换都讲完了。总结一下,C++类型转换其实是对C语言类型转换的细分及扩充(扩充类类型之间的转换)。
《C++Primer》中有一句特别好:强制类型转换关闭或挂起了正常的类型检查。强烈建议程序员避免使用强制类型转换,不依赖强制类型转换也能写出很好的C++程序。
- c++-----强制类型转换
- 【C++】强制类型转换
- C 强制类型转换
- C 强制类型转换
- C 强制类型转换
- C/C++强制类型转换。。。
- c/c++强制类型转换
- C语言类型强制转换
- c/c++强制类型转换
- C语言强制类型转换
- C中的类型强制转换
- c/c++强制类型转换
- C语言类型强制转换
- C/C++类型强制转换
- C语言强制类型转换
- C指针强制类型转换
- c/c++强制类型转换
- C/C++强制类型转换
- Android NDK开发指南(一) Application.mk文件
- erlang lists 操作
- 【求助】Qt---QGridLayout
- Jboss 5.1 虚拟目录的配置
- mysql explain是用来干什么的
- C++强制类型转换
- Lighttpd中CGI执行流程
- [Linux Jee] Linux部署多个实例的分布式程序时的目录结构
- ARM 各频率计算方法
- 整理出来的一些Android基础知识
- Red5边源服务器集群部署 《在线视频会议系统》
- C#基础知识整理:基础知识(10) 静态
- java基础--多态与包
- java正则替换标点