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

 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. C#的类成员初始化顺序

    C#的类成员的定义和声明如下 using UnityEngine; using System.Collections; public class TestController : ECControll ...

  2. bzoj 1036 [ZJOI2008]树的统计Count(树链剖分,线段树)

    1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 10677  Solved: 4313[Submit ...

  3. POJ 3616 Milking Time 简单DP

    题意:奶牛Bessie在0~N时间段产奶.农夫约翰有M个时间段可以挤奶,时间段f,t内Bessie能挤到的牛奶量e.奶牛产奶后需要休息R小时才能继续下一次产奶,求Bessie最大的挤奶量. 详见代码 ...

  4. 【解决】Internet访问看似正常(无叹号受限)却打不开网页

    嘛╮(╯▽╰)╭ 可能是前几天中了一等奖败了人品 .. 今天果断受点小挫折 事情是这样的:昨晚电脑在不插电的情况下打了一小时“剑灵”,有点烫,电量剩30%,关机睡觉,今早发现上不去网页了! 桌面右下角 ...

  5. noip2011 公交观光

    描述 风景迷人的小城Y市,拥有n个美丽的景点.由于慕名而来的游客越来越多,Y市特意安排了一辆观光公交车,为游客提供更便捷的交通服务.观光公交车在第0分钟出现在1号景点,随后依次前往2.3.4……n号景 ...

  6. 软件缺陷分析方法:ODC

    资料 Orthogonal Defect Classification:简要描述. ODC-5-2.pdf :详细说明了ODC对于缺陷属性分类的描述,以及具体应该怎么划分. ODC-5-2-Exten ...

  7. HighCharts 后台加载数据的时候去掉默认的 series

    var chart; var options = { chart: { renderTo: 'container', type:'line' }, title: { text: '历史趋势时序图', ...

  8. Android学习(一)

    #常见布局 ###线性布局 有一个布局方向,水平或者竖直 在竖直布局下,左对齐.右对齐,水平居中生效 在水平布局下,顶部对齐.底部对齐.竖直居中生效 权重:按比例分配屏幕的剩余宽度或者高度 ###相对 ...

  9. [转]mysql 5.6 存储过程+事务+游标+错误异常抛出+日志写入

    转自:http://www.wolonge.com/post/detail/118249 DELIMITER $$ USE `ecstore`$$ DROP PROCEDURE IF EXISTS ` ...

  10. JavaBean以及MVC模式

    JavaBean,  咖啡豆. JavaBean是一种开发规范,可以说是一种技术. JavaBean就是一个普通的java类.只有符合以下规定才能称之为javabean: 1)必须提供无参数的构造方法 ...