当前位置:  编程技术>c/c++/嵌入式

C++类型转换归纳总结

    来源: 互联网  发布时间:2014-10-26

    本文导语:  学过C++的人都知道,C++是强类型语言,因此变量在使用前就要声明数据类型,不同数据类型分配的内存空间大小也是不同,在转换类型时尤其需要注意这个问题,以防止数据丢失或越界溢出。本文将详细归纳总结一下C++的类型...

学过C++的人都知道,C++是强类型语言,因此变量在使用前就要声明数据类型,不同数据类型分配的内存空间大小也是不同,在转换类型时尤其需要注意这个问题,以防止数据丢失或越界溢出。本文将详细归纳总结一下C++的类型转换。

C++从C发展而来,也继承两种C风格的转换:隐式转换和显式转换。

1.隐式转换

隐式转换是指由编译系统自动进行,不需要人工干预的类型转换,例如:

short a = 2000;
int b;
b = a;

隐式转换,也包括构造函数和运算符的转换,例如:

class A {};
class B {
public: 
  B (A a) {}
};

 
A a;
B b = a;

2.显式转换

和隐式转换相反,显式转换要利用强制类型转换运算符进行转换,例如:

double x = 10.3;
int y;
y = int (x);  // 函数式写法
y = (int) x;  // C风格写法

以上类型转换已经满足了基本类型的转换了。但是如果想转换类和指针,有时代码可以编译,在运行过程中会出错。例如:

#include 

class CDummy {
  float i,j;
public:
  CDummy () { i=1; j=1; }
};

class CAddition {
  int x,y;
public:
  CAddition () { x=1; y=1; }
  int result() { return x+y;}
};

int main () {
 CDummy d;
 CAddition * padd;
 padd = (CAddition*) &d;
 std::cout result();
 return 0;
}

这段代码会在运行期出错,在执行padd->result()时发生异常,有些编译器会异常退出。
传统明确的类型转换,可以转换成任何其他指针类型任何指针,它们指向的类型无关。在随后的调用成员的结果,会产生一个运行时错误或意外的结果。

C++标准转换运算符

传统的类和指针的类型转换方式很不安全,可能会在运行时异常退出,标准C++ 提供了四个转换运算符:dynamic_cast、reinterpret_cast、static_cast、 const_cast
dynamic_cast (expression)
reinterpret_cast (expression)
static_cast (expression)
const_cast (expression)

1.dynamic_cast

dynamic_cast只能用于指针和引用的对象。其目的是确保类型转换的结果是一个有效的完成所请求的类的对象,所以当我们从一个类转换到这个类的父类,dynamic_cast总是可以成功。dynamic_cast可以转换NULL指针为不相关的类,也可以任何类型的指针为void指针。

class CBase { };
class CDerived: public CBase { };
CBase b;
CDerived d;

CBase* pb = dynamic_cast(&d);    // 子类转父类,正确
//CDerived* pd = dynamic_cast(&b); // 父类转子类,错误

当新的类型不是被转换的类型的父类,dynamic_cast无法完成指针的转换,返回NULL。当dynamic_cast转换引用类型时,遇到失败会抛出Bad_cast 异常。

2.static_cast

static_cast可以执行相关的类的指针之间的转换,可以在子类和父类之间相互转换,但父类指针转成子类指针是不安全的。static_cast没有在运行时进行安全检查,因此我们要先确保转换是安全的。另一方面,static_cast对比dynamic_cast少了在类型安全检查的开销。

class CBase {};
class CDerived: public CBase {};
CBase * a = new CBase;
CDerived * b = static_cast(a);

上述代码是合法的,b指向一个不完整的对象,可能在运行期导致错误。
static_cast也可以用来执行任何其他非指针的转换,如基本类型enum, struct, int, char, float等之间的标准转换:

double d = 3.14159265;
int i = static_cast(d); 
void* p = static_cast(&i); //任意类型转换成void类型

3.reinterpret_cast

reinterpret_cast转换成任何其他指针类型,甚至无关的类,任何指针类型。操作的结果是重新解释类型,但没有进行二进制的转换。所有的指针转换是允许的:不管是指针指向的内容还是指针本身的类型。

class A {};
class B {};
A * a = new A;
B * b = reinterpret_cast(a)

reinterpret_cast还可以用来转换函数指针类型,例如:

typedef void(*Func)();         // 声明一种函数指针定义,返回void
Func pFunc;              // 定义FuncPtr类型的数组

//pFunc = &test;             // 编译错误!类型不匹配
pFunc = reinterpret_cast(&test); // 编译成功!转换函数指针类型

4.const_cast

const_cast用于操纵对象的常量性,去掉类型的const或volatile属性。

#include 

void print (char * str){
 std::cout 

    
 
 

您可能感兴趣的文章:

  • 标准c++四种强制类型转换方式介绍
  • 为什么linux下的C++程序这么少见? 请问那里有linux下的C++程序?什么类型的程序都可以.
  • 深入理解:Java是类型安全的语言,而C++是非类型安全的语言
  • 请问c++中的DWORD是什么类型??
  • 深入C++四种强制类型转换的总结
  • C++如何通过ostringstream实现任意类型转string
  • 关于C++数据类型转换的问题
  • 利用C++实现从std::string类型到bool型的转换
  • 请问,LINUX的C++中,如何将string类型与char数组一次性互相转换?
  • 用C++实现strcpy(),返回一个char*类型的深入分析
  • 浅谈C++中的string 类型占几个字节
  • 从汇编看c++中变量类型的深入分析
  • c++动态内存空间示例(自定义空间类型大小和空间长度)
  • c++中的4种类型转化方式详细解析
  • 基于C++浮点数(float、double)类型数据比较与转换的详解
  • 解析C++中四种强制类型转换的区别详解
  • C++中Operator类型强制转换成员函数解析
  • c++显式类型转换示例详解
  • 基于C++类型重定义的使用详解
  • c++隐式类型转换示例分享
  • 用标准c++实现string与各种类型之间的转换
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Python3中内置类型bytes和str用法及byte和string之间各种编码转换
  • 请问能否把任何类型数据转换为一种类型,然后从这种类型又转换回去?例如:int>>Object Object>>int
  • 如何实现float 到 int 的类型转换,string 到 int 的类型转换?
  • void *类型与其他指针类型的相互转换?
  • 如何将String类型转换成Blob类型
  • 怎样将字符串类型转换成double类型?
  • (在线等)无符号int类型如何向ip类型进行转换呢
  • String类型数据与Date类型转换的问题?
  • 如何将java.util.Date类型的日期转换成java.sql.Date类型的日期?
  • 如何将Srting类型的字符窜转换成byte[]类型的数组呢?
  • 怎样把一个int类型(不是Integer)转换才String类型?
  • C语言中自动隐式转换与类型强制转换实例分析
  • 哪位大哥大姐知道结果集中的日期类数据在输出显示时应转换为什么类型的数据,怎么转换?
  • java中的字符类型如何转换成String类型
  • 怎么样把基本数据类型转换为引用类型啊?唉,菜鸟
  • QString 类型如何转换到char *类型?
  • 小问题:如何将一个字符串类型(比如“2001-6-26”)转换为一个日期类型?立即给分。
  • 如何从Vector中提取任意类型的对象(是否涉及强制类型转换)?
  • 因为mmap函数返回值是void*类型,是否可以将其强制转换成char*类型,按字符串操作,然后将修改重新写入内存映像即可????
  • 怎么将一个字符串类型转换为整型,比如说将“123”转换为123
  • 一个String类型的Vector向量数组如何转换成一个String类型数组(请给代码)?
  • java命名空间javax.xml.ws注释类型webserviceref成员方法: type定义参考
  • java 基本类型或可序列化类型,这里说的可序列化类型是什么意思???具体都有哪些类型??谢谢
  • java命名空间javax.annotation注释类型resource的类成员方法: authenticationtype定义及介绍
  • 求救:关于将类型名称字符串转变成类型相应类型的问题
  • java命名空间javax.annotation注释类型resource的类成员方法: type定义及介绍
  • c# 所有类型都从Object类型派生
  • java命名空间javax.xml.ws注释类型webserviceref成员方法: value定义参考
  • ado的rs.field("字段名")可以访问任何类型的数据,那吗java里面这种问题如何处理。是不是要先判断类型然后再根据类型来使用相应的getint or getString阿!谢谢了!在线等待!
  • java命名空间javax.annotation注释类型resource的类成员方法: shareable定义及介绍
  • c# 引用类型和值类型




  • 特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3