C++ 4种强制类型转换
C++的四种强制类型转换为:static_cast、const_cast、reinterpret_cast和dynamic_cast
类型转换的一般形式:cast-name(expression);
static_cast
任何具有明确定义的类型转换,只要不包含底层const,都可以使用static_cast;
double slope = static_cast(j) / i;
注:
顶层const:表示指针本身是个常量。如:int *const p;
底层const:表示指针所指的对象是一个常量。如:int const *p;
const_cast
该运算符只能改变运算对象的底层const。
#include<iostream>
using namespace std;
int main()
{
const char *pc=" HDU";
char *p=const_cast<char *>(pc); //正确,
cout<<"hello"<<p<<endl;
return 0;
}
注:此处只能用const_cast,而不能用static_cast;
reinterpret_cast
通常为运算对象的位模式提供较低层次上的重新解释。
注:
1、在指针之间转换,将一个类型的指针转换为另一个类型的指针,无关类型;
2、将指针值转换为一个整型数,但不能用于非指针类型的转换。
dynamic_cast
只用于对象的指针和引用,不能用于内置的基本数据类型的强制转换。
使用dynamic_cast进行转换的,基类中一定要有虚函数,否则编译不通过。
运行时类型识别,用于将基类的指针或引用安全地转换成派生类的指针或引用。
对指针进行dynamic_cast,失败返回null,成功返回正常cast后的对象指针;
对引用进行dynamic_cast,失败抛出一个异常bad_cast,成功返回正常cast后的对象引用。
对于“向上转换”(即派生类指针或引用类型转换为其基类类型),无论是指针还是引用向上转换都是安全地。
对于“向下转型”有两种情况:
1、基类指针所指对象是派生类类型的,这种转换是安全的;
2、基类指针所指对象为基类类型,在这种情况下dynamic_cast在运行时做检查,转换失败,返回结果为0;
在引用上,dynamic_cast依旧是常用于“安全的向下转型”。与指针一样,引用的向下转型也可以分为两种情况,与指针不同的是,并不存在空引用,所以引用的dynamic_cast检测失败时会抛出一个bad_cast异常。
#include <iostream>
#include <cstring>
using namespace std;
class A
{
public:
virtual void f()
{
cout << "hello" << endl;
}
};
class B: public A
{
public:
void f()
{
cout << "hello2" << endl;
}
};
int main()
{
A* a1=new B;//a1是A类型的指针指向一个B类型的对象
A* a2=new A;//a2是A类型的指针指向一个A类型的对象
B* b;
b=dynamic_cast<B*>(a1);
//结果为not null,向下转换成功,a1之前指向的就是B类型的对象,所以可以转换成B类型的指针。
if(b==NULL)
cout<<"null"<<endl;
else
cout<<"not null"<<endl;
b=dynamic_cast<B*>(a2);//结果为null,向下转换失败
if(b==NULL)
cout<<"null"<<endl;
else
cout<<"not null"<<endl;
return 0;
}
总结
基本类型转换用static_cast。
去const属性用const_cast。
不同类型的指针类型转换用reinterpreter_cast。
多态类之间的类型转换用daynamic_cast。
C++ 4种强制类型转换
C++的四种强制类型转换为:static_cast、const_cast、reinterpret_cast和dynamic_cast
类型转换的一般形式:cast-name(expression);
static_cast
任何具有明确定义的类型转换,只要不包含底层const,都可以使用static_cast;
double slope = static_cast(j) / i;
注:
顶层const:表示指针本身是个常量。如:int *const p;
底层const:表示指针所指的对象是一个常量。如:int const *p;
const_cast
该运算符只能改变运算对象的底层const。
#include<iostream>
using namespace std;
int main()
{
const char *pc=" HDU";
char *p=const_cast<char *>(pc); //正确,
cout<<"hello"<<p<<endl;
return 0;
}
注:此处只能用const_cast,而不能用static_cast;
reinterpret_cast
通常为运算对象的位模式提供较低层次上的重新解释。
注:
1、在指针之间转换,将一个类型的指针转换为另一个类型的指针,无关类型;
2、将指针值转换为一个整型数,但不能用于非指针类型的转换。
dynamic_cast
只用于对象的指针和引用,不能用于内置的基本数据类型的强制转换。
使用dynamic_cast进行转换的,基类中一定要有虚函数,否则编译不通过。
运行时类型识别,用于将基类的指针或引用安全地转换成派生类的指针或引用。
对指针进行dynamic_cast,失败返回null,成功返回正常cast后的对象指针;
对引用进行dynamic_cast,失败抛出一个异常bad_cast,成功返回正常cast后的对象引用。
对于“向上转换”(即派生类指针或引用类型转换为其基类类型),无论是指针还是引用向上转换都是安全地。
对于“向下转型”有两种情况:
1、基类指针所指对象是派生类类型的,这种转换是安全的;
2、基类指针所指对象为基类类型,在这种情况下dynamic_cast在运行时做检查,转换失败,返回结果为0;
在引用上,dynamic_cast依旧是常用于“安全的向下转型”。与指针一样,引用的向下转型也可以分为两种情况,与指针不同的是,并不存在空引用,所以引用的dynamic_cast检测失败时会抛出一个bad_cast异常。
#include <iostream>
#include <cstring>
using namespace std;
class A
{
public:
virtual void f()
{
cout << "hello" << endl;
}
};
class B: public A
{
public:
void f()
{
cout << "hello2" << endl;
}
};
int main()
{
A* a1=new B;//a1是A类型的指针指向一个B类型的对象
A* a2=new A;//a2是A类型的指针指向一个A类型的对象
B* b;
b=dynamic_cast<B*>(a1);
//结果为not null,向下转换成功,a1之前指向的就是B类型的对象,所以可以转换成B类型的指针。
if(b==NULL)
cout<<"null"<<endl;
else
cout<<"not null"<<endl;
b=dynamic_cast<B*>(a2);//结果为null,向下转换失败
if(b==NULL)
cout<<"null"<<endl;
else
cout<<"not null"<<endl;
return 0;
}
总结
基本类型转换用static_cast。
去const属性用const_cast。
不同类型的指针类型转换用reinterpreter_cast。
多态类之间的类型转换用daynamic_cast。
C++ 4种强制类型转换的更多相关文章
- C#中,三种强制类型转换的对比
在C#中,我们可以看到三种强制类型转换,比如强制转换成有符号32位整型,可以找到下面三种方式: ① (int)() ②Convert.ToInt32() ...
- 四种强制类型转换的总结(const_cast、static_cast、dynamic_cast、reinterpreter_cast)
四种强制类型转换的总结(const_cast.static_cast.dynamic_cast.reinterpreter_cast) 转载 2011年10月03日 23:59:05 标签: stru ...
- C++中的关键字用法--- 四种强制类型转换的总结
四种强制类型转换的总结(const_cast.static_cast.dynamic_cast.reinterpreter_cast 1. C风格的强制类型转换(Type Cast)很简单,不管什么类 ...
- [转载]C++中四种强制类型转换方式
C++中四种强制类型转换方式 原文地址:http://www.cnblogs.com/home123/p/6763967.html 类型转换有c风格的,当然还有c++风格的.c风格的转换的格式很简单( ...
- 【C++】 四种强制类型转换(static_cast 与 dynamic_cast 的区别!)
强制类型转换 1. static_cast 2. dynamic_cast 3. const_cast 4. reinterpret_cast 5. 为什么要需要四种类型转换? 1. static_c ...
- C++的几种强制类型转换
有时我们希望显式地将对象强制类型转换成另外一种类型.例如,如果想在下面的代码中执行浮点数除法: int i, j; double slope = i / j; 就要使用某种方法将i和/或j显式地转换成 ...
- C++开发必看 四种强制类型转换的总结 [转]
一.C风格的强制类型转换(Type Cast)很简单,不管什么类型的转换统统是: TYPE b = (TYPE)a 二.C++风格的类型转换提供了4种类型转换操作符来应对不同场合的应用. co ...
- C++四种强制类型转换关键字
C语言使用强制类型转换(Type Cast)很简单,不管什么类型的转换,形式都如下: TYPE b = (TYPE)a; c++提供了4种类型转换操作符来应对不同场合的应用. const_cast ...
- C++开发必看 四种强制类型转换的总结
C风格的强制类型转换(Type Cast)很简单,不管什么类型的转换统统是: TYPE b = (TYPE)a C++风格的类型转换提供了4种类型转换操作符来应对不同场合的应用. const_cast ...
随机推荐
- linux grep的选项
grep -i 关闭大写和小写敏感性 grep -v 打印全部不包括. . 的行(屏蔽某些条目) grep -l 打印包括模式的文件名称 grep ...
- 【云计算】IBM开放云架构
IBM 的开放云架构 通过改变业务和社会运行的方式,云计算开启了丰富的创新途径.开发人员现在正将记录系统与参与性系统相结合,一种新的基于云的应用程序风格正在出现:交互系统.这些应用程序要可持续发展,云 ...
- (转) java中try/catch性能和原理
stackoverflow上有一个讨论,参与的人还挺多: https://stackoverflow.com/questions/141560/should-try-catch-Go-inside-o ...
- sip
INVITE sip:10010101402@10.7.36.70:5060 SIP/2.0 Via: SIP/2.0/UDP 10.7.36.250:5060;rport;branch=z9hG4b ...
- 《暗黑世界V1.4》API说明文档
<暗黑世界V1.4>API说明文档 阵法位置示意图 上方: 下方: 账号注册 100 请求信息 { username str ...
- Java学习笔记3、变量、数据类型
标识符 常见的命名规则(见名知意) 包名全部小写 类或者接口,一个单词:首字母大写,多个单词:每个单词首字母大写. 方法或者变量:一个单词:首字母小写,多个单词:从第二个单词开始,每个单词首字母大写. ...
- 关于 yii2 cron运行 console的脚本不运行,可是手动运行成功的原因
在yii2中运行脚本出现了一个问题 手动运行没有问题. 在cron中不运行.最后找出来了原因 打开yii文件(在根文件夹以下) #!/usr/bin/env php <?php /** * Yi ...
- 【Linux】行首、行尾添加字符串
在行首或者行尾添加字符串的方式有以下2种 环境描述 test.txt文件内容如下: hello world Qinys 要求:在每一行的行首添加AAA,行尾添加666 VIM编辑状态添加 首先使用命令 ...
- jConsole,jvisualvm和jmap使用
JConsole JConsole 是一个内置 Java 性能分析器,可以从命令行或在 GUI shell 中运行.可以轻松地使用 JConsole来监控 Java 应用程序性能和跟踪 Jav ...
- Linux中使用Crontab定时监测维护Tomcat应用程序的方法
Linux中使用Crontab定时监测维护Tomcat应用程序的方法 功能需求: 定时监测发布的某项应用程序是否可用,如果不可用,立即执行处理措施,实现自动化运维工作. 监测的应用接口: 新闻接口.天 ...