C++的显示转换
利用显示转换使得我们可以很容易发现它们,因为通过名字就能找到:
| static_cast | 用于“良性”和“适度良性”转换,包括不用强制转换 |
| const_cast | 对“const”和“volatile”进行转换 |
| reinterpret_cast | 转换为完全不同的意思,为了安全使用它,关键必须转换为原来的类型 。这是所有转换中最危险的 |
| dynamic_cast | 用于类型安全向下转换 |
1.静态转换(static_cast)
static_cast包含的转换类型包括典型的非强制变换,窄化(有信息丢失)变换,使用void*的强制转换,隐式类型变换和类层次的静态定位。
用法:static_cast < type-id > ( expression )
该运算符把expression转换为type-id类型,但没有运行时类型检查来保证转换的安全性。它主要有如下几种用法:
①用于类层次结构中基类和子类之间指针或引用的转换。
进行上行转换(把子类的指针或引用转换成基类表示)是安全的;
进行下行转换(把基类指针或引用转换成子类表示)时,由于没有动态类型检查,所以是不安全的。
②用于基本数据类型之间的转换,如把int转换成char,把int转换成enum。这种转换的安全性也要开发人员来保证。
③把空指针转换成目标类型的指针。
void func(int){}
int main()
{
int i=0x7fff;
long l;
float f;
//典型的非强制类型转换
l=i;
f=i;
l=static_cast<long>(i);
f=static_cast<float>(i);
//窄化变换
i=l;
i=f;
i=static_cast<int>(l);
i=static_cast<int>(f);
char c=static_cast<char>(i);
//使用void* 的强制变换
void* vp=&i;
float* fp=(float*)vp;
//Error:C++中不用强制转换是不能从void* 中赋值的
// fp=vp;
fp=static_cast<float*>(vp);
//隐式类型变换
double d=0.0;
int x=d;
x=static_cast<int>(d);
func(d);
func(static_cast<int>(d));
return 0;
}
2.常量变换(const_cast)
用法:const_cast<type_id> (expression)
该运算符用来修改类型的const或volatile属性。除了const 或volatile修饰之外, type_id和expression的类型是一样的。
常量指针被转化成非常量指针,并且仍然指向原来的对象;
常量引用被转换成非常量引用,并且仍然指向原来的对象;
如果从const转换为非const,或从volatile转换为非volatile,或者从非const转换为const ,非volatile转换为volatile可以使用const_cast。
int main()
{
const int i=0;
//Error:取得const对象的指针,不用转换是不能把它赋值给非const指针的
// int* j=&i;
int* j=(int*)&i;
j=const_cast<int*>(&i);
//Error:const_cast<type_id>(expression)中除了const 或volatile修饰之外,type_id和expression的类型是一样的
// long* l=const_cast<long*>(&i);
volatile int k=0;
int* u=const_cast<int*> (&k);
}
3.重解释转换(reinterpret_cast)
用法:reinterpret_cast<type-id> (expression)
type-id必须是一个指针、引用、算术类型、函数指针或者成员指针。
它可以把一个指针转换成一个整数,也可以把一个整数转换成一个指针(先把一个指针转换成一个整数,在把该整数转换成原类型的指针,还可以得到原先的指针值)。
这是最不安全的一种转换机制。reinterpret_cast把对象假象成另一个完全一个不同类型的对象。reinterpret_cast的思想就是当需要使用的时候,所得到的东西已经不同了,以至于它不能用于类型的原来目的,除非再次把它转换回来。
#include <iostream>
using namespace std;
const int sz=100;
struct X{int a[sz];};
void print(X* x)
{
for(int i=0;i<sz;i++)
{
cout<<x->a[i]<<" ";
}
cout<<endl<<"-----------------"<<endl;
}
int main()
{
X x;
print(&x); //出来的是没有意义的值
int* xp=reinterpret_cast<int*>(&x);
for(int* i=xp;i<xp+sz;i++)
{
*i=0;
}
print(reinterpret_cast<X*>(xp));
print(&x);
}
C++的显示转换的更多相关文章
- 显示转换explicit和隐式转换implicit
用户自定义的显示转换和隐式转换 显式转换implicit关键字告诉编译器,在源代码中不必做显示的转型就可以产生调用转换操作符方法的代码. 隐式转换implicit关键字告诉编译器只有当源代码中指定了显 ...
- [C++][操作符]四种显示转换操作符
整理了C++ Primer中提到的四种显示转换,用思维导图写出来,是不是很清晰O(∩_∩)O.
- ahjesus自定义隐式转换和显示转换
implicit 关键字用于声明隐式的用户定义类型转换运算符. 如果可以确保转换过程不会造成数据丢失,则可使用该关键字在用户定义类型和其他类型之间进行隐式转换. 参考戳此 explicit ...
- C#隐式转换和显示转换举例--C#基础
高精度的数据类型转换为低精度的数据类型是显示转换,低精度的转换为高精度的是隐式转换. 温馨提示:不能说强制类型转换是从低精度到高精度. int a=666;float b=(float)a: 由a到b ...
- oracle显示转换字段类型cast()函数
今天遇到一个查询类型转换的问题:表的字段是varchar2类型,然后查询到的结果要转换为number(20,2),刚开始的时候使用to_number()函数,发现不能满足需求.后来才知道,原来还有ca ...
- 【C++自我精讲】基础系列五 隐式转换和显示转换
[C++自我精讲]基础系列五 隐式转换和显示转换 0 前言 1)C++的类型转换分为两种,一种为隐式转换,另一种为显式转换. 2)C++中应该尽量不要使用转换,尽量使用显式转换来代替隐式转换. 1 隐 ...
- sql优化_隐式-显示转换
======== 测试表1信息 =======SQL> select count(*) from tb_test; COUNT(*)---------- 3000000 SQL&g ...
- C#隐式转换与显示转换
System.Objec时C#中所有类型的基类,也就是万类之源. 一.值类型 值类型都继承自System.ValueType(派生自System.Objec),继承自System.ValueType的 ...
- 分享知识-快乐自己:SpringMvc后台Date对象数据 到 前台页面的显示转换
常常为日期格式的转换而烦恼吗?那么就试试看看楼主的方式吧!让你摆脱烦恼,从而快乐撸码. 如果你只用作于一个日期的显示采用方式如下: 导入:相应的类库 <%@ taglib uri="h ...
随机推荐
- 好用的ajax后台框架
dwz 简单实用的国产jquery Ui框架 http://www.j-ui.com/#_blank
- List迭代循环时出现分问题
一个List,通过迭代之后给List中的实体重新赋值,代码如下 public List getListByPage(Page currPage) { Map recordTypeMap = BusnD ...
- Java中url传递中文参数取值乱码的解决方法
java中URL参数中有中文值,传到服务端,在用request.getParameter()方法,得到的常常会是乱码,这将涉及到字符解码操作. 方法一: http://xxx.do?ptname=’我 ...
- dell vfoglight
vFoglight针对RH/Vmware/Hyper-v/Vsphere环境的相关软件包下载链接 https://software.dell.com/register/getfile/?param=2 ...
- OGG问题 ORA-01403的处理办法
认识logdump分析工具及常用命令:http://book.51cto.com/art/201202/319253.htm http://www.killdb.com/2012/09/01/gold ...
- 【转】G40-70、G50-70联想小新笔记本SR1000随机Linux改Windows 7系统操作指导
http://support1.lenovo.com.cn/lenovo/wsi/htmls/detail_20140505150749705.html 适用范围:G40-70,G50-70联想小新笔 ...
- springMVC3学习(八)--全球异常处理
在springMVC在配置文件: <bean id="exceptionResolver" class="org.springframework.web.servl ...
- 使用lua给wireshark编写uTP的Dissector
lonelycastle做uTP的实验,使用wireshark捕包,但是最初没有找到wireshark下的uTP的dissector,每次都需要比对文档,这样做实验理解报文含义,效率非常低.作为程 ...
- python学习笔记--Django入门0 安装dangjo
经过这几天的折腾,经历了Django的各种报错,翻译的内容虽然不错,但是与实际的版本有差别,会出现各种奇葩的错误.现在终于找到了解决方法:查看英文原版内容:http://djangobook.com/ ...
- Oracle 安装安全补丁过程中出现的问题
为Oracle安装安全补丁,首先在官网上下载相应版本的补丁. 根据官方文档的说明安装,但是在安装的过程中会出项各种各样的错误,这里仅仅把我遇到的记录下来,给大家提供参考. 首先按照官方文档安装. 在这 ...