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++的显示转换

时间: 2024-10-03 18:47:47

C++的显示转换的相关文章

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

高精度的数据类型转换为低精度的数据类型是显示转换,低精度的转换为高精度的是隐式转换. 温馨提示:不能说强制类型转换是从低精度到高精度. int a=666;float b=(float)a: 由a到b的转换是低精度到高精度的转换,为隐式转换,但是也加了强制转换(float),当然不加也是对的. 1.隐式转换示例: using System; using System.Collections.Generic; using System.Linq; using System.Text; using

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

0 前言 1)C++的类型转换分为两种,一种为隐式转换,另一种为显式转换. 2)C++中应该尽量不要使用转换,尽量使用显式转换来代替隐式转换. 1 隐式转换 定义:隐式转换是系统跟据程序的需要而自动转换的. 1)C++类型(char,int,float,long,double等)的隐式转换: 算术表达式隐式转换顺序为: 1.char - int - long - double 2.float - double //1)算术表达式 int m = 10; double n = m;//n = 10

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

implicit    关键字用于声明隐式的用户定义类型转换运算符. 如果可以确保转换过程不会造成数据丢失,则可使用该关键字在用户定义类型和其他类型之间进行隐式转换. 参考戳此 explicit    关键字用于声明必须使用强制转换来调用的用户定义的类型转换运算符. 参考戳此 有一点要注意的是,一个类中不能同时写显式和隐式声明,只能是其中一个. 但是如果声明了隐式的转换,那么其对应的显示转换也会自动提供. 如果声明了显式转换,其对应的隐式转换不会提供的.  ahjesus自定义隐式转换和显示转换

||或和&amp;&amp;且的高级用法,以及隐式转换和显示转换。

或的高级用法 console.log(true || true); // true console.log(true || false); // true console.log(false || true); // true console.log(false || false); // false console.log(0 || false); // false console.log(false || 0); // 0 console.log(0 || true); //true con

javascript 数据类型,隐示和显示转换

一.隐示转换 代码执行过程中,javascript会根据需要对数据类型进行转换 示例 a=NaN;b=null;c=undefined;d='';e=4;f='test'; 1.转换为逻辑数据类型 可以通过以下方式查看转换后的结果 if(a){ alert("NaN"转换成逻辑类型的值是True"); }else{ alert("NaN"转换成逻辑类型的值是False"); } 各种示例所对应的结果: NaN=>false; null=&g

马哥-python-课堂笔记12-python核心数据类型及类型显示转换

python的核心数据类型(内置)数字:int,long,float,complex(复数),bool(布尔型)字符:str,unicode列表:list字典:dict元组:tuple文件:file其他的类型:集合(set),frozenset(冻结集合),类类型,None其他文件类工具:pipes(管道),fifos(先进先出管道),sockets(套接字) 类型转换:内置函数,完成非字符串转化为字符型str():和print的输出的结果类似repr():表示的是精确值format():以特定

维护基础数据之后,程序不重启,不能正确显示转换内容。

public static ObservableCollection<CListModel> AllTravelProjectList { get { if (_BankStatementStatusList == null) { var travelProject = OutPutManageDal.GetInstance().GetOutPut(new XGX_TRAVELPROJECT()); _BankStatementStatusList = new ObservableCollec

oracl 不同数据类型之间的显示转换

c#自定义类型的转换方式operator,以及implicit(隐式)和explicit (显示)声明的区别

msdn参考:http://msdn.microsoft.com/zh-cn/library/s53ehcz3.aspx http://msdn.microsoft.com/zh-cn/library/z5z9kes2.aspx http://msdn.microsoft.com/zh-cn/library/xhbhezf4.aspx operator 关键字来重载内置运算符,或提供类或结构声明中的用户定义转换.它可以定义不同类型之间采用何种转化方式和转化的结果. operator用于定义类型转