利用显示转换使得我们可以很容易发现它们,因为通过名字就能找到:

 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++的显示转换的更多相关文章

  1. 显示转换explicit和隐式转换implicit

    用户自定义的显示转换和隐式转换 显式转换implicit关键字告诉编译器,在源代码中不必做显示的转型就可以产生调用转换操作符方法的代码. 隐式转换implicit关键字告诉编译器只有当源代码中指定了显 ...

  2. [C++][操作符]四种显示转换操作符

    整理了C++ Primer中提到的四种显示转换,用思维导图写出来,是不是很清晰O(∩_∩)O.

  3. ahjesus自定义隐式转换和显示转换

    implicit    关键字用于声明隐式的用户定义类型转换运算符. 如果可以确保转换过程不会造成数据丢失,则可使用该关键字在用户定义类型和其他类型之间进行隐式转换. 参考戳此 explicit    ...

  4. C#隐式转换和显示转换举例--C#基础

    高精度的数据类型转换为低精度的数据类型是显示转换,低精度的转换为高精度的是隐式转换. 温馨提示:不能说强制类型转换是从低精度到高精度. int a=666;float b=(float)a: 由a到b ...

  5. oracle显示转换字段类型cast()函数

    今天遇到一个查询类型转换的问题:表的字段是varchar2类型,然后查询到的结果要转换为number(20,2),刚开始的时候使用to_number()函数,发现不能满足需求.后来才知道,原来还有ca ...

  6. 【C++自我精讲】基础系列五 隐式转换和显示转换

    [C++自我精讲]基础系列五 隐式转换和显示转换 0 前言 1)C++的类型转换分为两种,一种为隐式转换,另一种为显式转换. 2)C++中应该尽量不要使用转换,尽量使用显式转换来代替隐式转换. 1 隐 ...

  7. sql优化_隐式-显示转换

    ========  测试表1信息   =======SQL> select count(*) from tb_test; COUNT(*)----------   3000000   SQL&g ...

  8. C#隐式转换与显示转换

    System.Objec时C#中所有类型的基类,也就是万类之源. 一.值类型 值类型都继承自System.ValueType(派生自System.Objec),继承自System.ValueType的 ...

  9. 分享知识-快乐自己:SpringMvc后台Date对象数据 到 前台页面的显示转换

    常常为日期格式的转换而烦恼吗?那么就试试看看楼主的方式吧!让你摆脱烦恼,从而快乐撸码. 如果你只用作于一个日期的显示采用方式如下: 导入:相应的类库 <%@ taglib uri="h ...

随机推荐

  1. [洛谷U871]building

    题目来源:http://www.luogu.org/problem/show?pid=U871# [题目背景 Background] WOW是BLIZZARD公司开发的一款网络游戏,游戏的背景是处在一 ...

  2. msm8610 lcd driver code analysis

    ---恢复内容开始--- 1  lcd probe The probe sequence is determined by compilation sequence: mdss-mdp3-objs = ...

  3. kvm 对虚拟机里面插u盘

    KVM虚拟机上关于宿主机的USB设备使用问题探究 KVM usb passthrough就是将宿主机的usb接口直接给虚拟机使用,usb接口上的设备也就直接可以在虚拟机上使用: 测试通过usb pas ...

  4. vmware产品

    https://my.vmware.com/cn/group/vmware/info?slug=datacenter_cloud_infrastructure/vmware_vsphere/5_5#o ...

  5. 2 weekend110的mapreduce介绍及wordcount + wordcount的编写和提交集群运行 + mr程序的本地运行模式

    把我们的简单运算逻辑,很方便地扩展到海量数据的场景下,分布式运算. Map作一些,数据的局部处理和打散工作. Reduce作一些,数据的汇总工作. 这是之前的,weekend110的hdfs输入流之源 ...

  6. 改变JVM中的参数以提高Eclipse的运行速度

    首先建立评估体系,将workspace里所有的项目close掉,关闭eclipse.优化的用例就是启动eclipse,open一个项目,eclipse会自动build这个项目,保证没有感觉到明显的卡, ...

  7. C# 的异步

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.N ...

  8. JDBC——Sql Server

    sun公司设计一套java语言操作不同的数据库提供的是接口,二具体的实现类是由各大数据库厂商实现的. private static final String driver= "com.mic ...

  9. Java整型与字符串相互转换(转)

    1如何将字串 String 转换成整数 int? A. 有两个方法: 1). int i = Integer.parseInt([String]); 或 i = Integer.parseInt([S ...

  10. [ES7] Exploring ES2016 Decorators

    Original artial --> link How descorator looks like: @mydecorator function myFun(){ ... } Descorat ...