`
熊滔爱孟涛静
  • 浏览: 124677 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

c++中各种转换

    博客分类:
  • C++
 
阅读更多

C++的四个类型转换运算符已经有很久了,但一直没有弄清楚它们的用法,今天看到一本书上的解释,才大致地的了解了其具体的用法.

具体归纳如下:

reinterpret_cast
该函数将一个类型的指针转换为另一个类型的指针.
这种转换不用修改指针变量值存放格式(不改变指针变量值),只需在编译时重新解释指针的类型就可做到.
reinterpret_cast 可以将指针值转换为一个整型数,但不能用于非指针类型的转换.
例:
//基本类型指针的类型转换
double d=9.2;
double* pd = &d;
int *pi = reinterpret_cast<int*>(pd);  //相当于int *pi = (int*)pd;

//不相关的类的指针的类型转换
class A{};
class B{};
A* pa = new A;
B* pb = reinterpret_cast<B*>(pa);   //相当于B* pb = (B*)pa;

//指针转换为整数
long l = reinterpret_cast<long>(pi);   //相当于long l = (long)pi;


const_cast

该函数用于去除指针变量的常量属性,将它转换为一个对应指针类型的普通变量。反过来,也可以将一个非常量的指针变量转换为一个常指针变量。
这种转换是在编译期间做出的类型更改。
例:
const int* pci = 0;
int* pk = const_cast<int*>(pci);  //相当于int* pk = (int*)pci;

const A* pca = new A;
A* pa = const_cast<A*>(pca);     //相当于A* pa = (A*)pca;

出于安全性考虑,const_cast无法将非指针的常量转换为普通变量。


static_cast

该函数主要用于基本类型之间和具有继承关系的类型之间的转换。
这种转换一般会更改变量的内部表示方式,因此,static_cast应用于指针类型转换没有太大意义。
例:
//基本类型转换
int i=0;
double d = static_cast<double>(i);  //相当于 double d = (double)i;

//转换继承类的对象为基类对象
class Base{};
class Derived : public Base{};
Derived d;
Base b = static_cast<Base>(d);     //相当于 Base b = (Base)d;


dynamic_cast

它与static_cast相对,是动态转换。
这种转换是在运行时进行转换分析的,并非在编译时进行,明显区别于上面三个类型转换操作。
该函数只能在继承类对象的指针之间或引用之间进行类型转换。进行转换时,会根据当前运行时类型信息,判断类型对象之间的转换是否合法。dynamic_cast的指针转换失败,可通过是否为null检测,引用转换失败则抛出一个bad_cast异常。
例:
class Base{};
class Derived : public Base{};

//派生类指针转换为基类指针
Derived *pd = new Derived;
Base *pb = dynamic_cast<Base*>(pd);

if (!pb)
    cout << "类型转换失败" << endl;

//没有继承关系,但被转换类有虚函数
class A(virtual ~A();)   //有虚函数
class B{}:
A* pa = new A;
B* pb  = dynamic_cast<B*>(pa);

如果对无继承关系或者没有虚函数的对象指针进行转换、基本类型指针转换以及基类指针转换为派生类指针,都不能通过编译。

分享到:
评论

相关推荐

    C,C++ To Delphi转换器(源码)

    标题中的"C,C++ To Delphi转换器"是指一个软件工具,其主要功能是将用C或C++编写的源代码转换为Delphi语言的源代码。这个转换过程可以帮助程序员将已有的C或C++项目迁移到Delphi环境中,或者利用Delphi的优势进行...

    C++到C#数据类型转换

    C++ 到 C# 数据类型转换 在软件开发中,数据类型转换是一个非常重要的步骤,特别是在使用不同的编程语言时。C++ 和 C# 是两种非常流行的编程语言,它们之间的数据类型转换是非常必要的。本文将详细介绍 C++ 到 C# ...

    C#中byte数组和c++结构体的转换

    在写C#TCP通信程序时,发送数据时,只能发送byte数组,处理起来比较麻烦不说,如果是和c++等写的程序通信的话,很多的都是传送结构体,在VC6.0中可以很方便的把一个char[]数组转换为一个结构体,而在C#却不能直接把...

    C++各种编码转换 Unicode UTF8

    根据提供的文件信息,本文将详细解释C++中几种常见的字符编码转换方法,特别是涉及Unicode与UTF-8之间的转换。在实际开发过程中,由于不同的系统、软件可能会采用不同的字符编码方式来存储文本数据,因此实现不同...

    C++简繁体转换 代码 + DEMO

    在C++中进行编码转换,通常需要使用库函数或者自定义实现。对于GBK和GB2312的转换,我们可以使用如iconv这样的库,该库提供跨平台的字符集转换功能。但是,如果DEMO代码中没有使用外部库,那么很可能是通过查找表...

    C++类各种类型转换_数据类型的相互转换_

    总的来说,C++的数据类型转换是一门深奥的学问,熟练掌握各种转换方法是成为一名合格的C++程序员的关键。在编写程序时,应始终注意类型安全,避免不必要的类型转换,特别是那些可能导致数据丢失或错误的转换。通过...

    C++和C#的类型转换

    在实际开发中,我们经常需要在C++和C#之间进行数据类型转换,以便于在不同的语言环境中进行数据交换。 在C++和C#中,数据类型是不同的,C++使用C语言的数据类型,而C#使用.NET Framework的数据类型。因此,在将C++...

    浅谈C++中强制类型转换函数

    C++中强制类型转换函数是指使用强制类型转换操作符来实现类型转换的过程。C++风格的类型转换提供了4种类型转换操作符来应对不同场合的应用,即const_cast、static_cast、dynamic_cast和reinterpret_cast。 const_...

    C++任意进制转换

    在编程领域,进制转换是一项基础且重要的技能。在C++中进行任意进制转换,不仅可以帮助我们...学习和理解这些概念对于任何C++程序员来说都是至关重要的,无论是在学术研究还是实际开发中,都能帮助解决各种复杂的问题。

    c++ 2.8.10进制转换

    在C++编程语言中,处理不同进制的转换是一项基本任务。本文将深入探讨C++ 2.8.10版本中的进制转换,并重点讲解如何将数字转换为不同的进制表示,特别是打印成表格形式。 进制是计数系统的基础,常见的有二进制...

    c++ 转换c# 工具

    标题 "c++ 转换c# 工具" 暗示了这是一个软件应用程序,其主要功能是将C++代码转换为C#代码。在编程领域,这种工具被称为源代码转换器或迁移工具,它们有助于开发人员在不同的编程语言之间迁移项目,尤其在有大量现有...

    C++常见类型转换

    本文将详细介绍C++中常见的类型转换,包括IP地址转换、CString类型转换、float、int、double类型转换、string类型转换等。 1. IP地址转换 在C++中,IP地址可以用CString类型来表示。为了将IP地址转换为CString类型...

    用C++编写数字转换成汉字大写的程序

    总之,用C++编写数字转换成汉字大写的程序是一项涉及字符串操作、数字逻辑和特定应用领域知识的任务,需要考虑到各种细节和特殊情况,以确保程序的准确性和实用性。通过不断的迭代和优化,可以创建出一个高效且可靠...

    C++实现的数制转换

    在C++这种强大而灵活的编程语言中,实现数制转换不仅可以加深对数值系统理解,还能帮助我们处理各种与数据表示相关的问题。本文将深入探讨如何使用C++进行数制转换,包括从十进制到二、八、十六进制的转换,以及反向...

    免费C++toC#转换工具

    免费好用的C++语言转C#语言工具,使用方便 免费好用的C++语言转C#语言工具,使用方便

    C++大地坐标转换经纬度源码

    在C++中,我们可以利用各种数学公式进行计算。例如,常见的转换方法包括高斯投影、UTM(Universal Transverse Mercator)投影等。高斯投影将地球表面的经纬度转换为直角坐标,适用于小范围的精确测量。UTM投影则将...

    关于托管C++和非托管C++各种字符串类型的转换

    ### 关于托管C++和非托管C++各种字符串类型的转换 #### 概述 本文将详细介绍托管C++(Managed C++)与非托管C++(Unmanaged C++)之间各种字符串类型转换的方法与技巧。虽然从表面上看这些转换操作似乎很简单,但...

    基于c++的GPS时间转换程序

    在IT行业中,GPS(全球定位系统)时间是一个重要的概念,它是通过卫星信号来确定地理位置和时间信息的。...通过理解GPS时间和UTC时间的差异,以及如何在C++中操作时间对象,我们可以构建出高效且准确的转换算法。

    C++转换JAVA工具

    总之,C++转换JAVA工具在多语言开发环境中扮演着重要角色,帮助开发者克服语言之间的障碍,实现更高效、更灵活的软件开发。了解和掌握这类工具的使用,对于提升开发效率和项目质量具有重要意义。

    C++ 通信常用转换函数汇总

    本文总结了 C++ 中常用的转换函数,包括 CRC16 的计算、校验、HEX 文件到 BIN 文件的转换、CString 转换为 Char、字符转换为 16 进制等。 1. 计算 CRC 码(CRC16) CRC(Cyclic Redundancy Check)是一种错误检测...

Global site tag (gtag.js) - Google Analytics