`

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);

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

 

 

Quote : http://blog.csdn.net/wskuge/archive/2008/09/27/2989499.aspx

分享到:
评论

相关推荐

    C++类型转换运算符的实例详解

    C++类型转换运算符的实例详解 C++中有4个类型转换运算符,使装换过程更规范 dynamic_cast; const_cast; static_cast; reinterpret_cast; 一、dynamic_cast 该运算符我在之前的文章中已经介绍过了 //...

    C++运算符重载转换运算符(讲解详细,不容错过)

    里面是一些关于C++运算符重载转换运算符的讲解

    c++ 数据类型、运算符与表达式

    c++ 数据类型、运算符与表达式 C++语言的基本元素、字符集和关键字 基本的数据类型的表示方法 常量和变量 类型转换 各种运算符与表达式

    C++ 类型转换运算符

    * 实现int类型转换为SamllInt类型 */ SmallInt(const int val): value(val) { cout &lt;&lt; "SmallInt(const int val)" &lt;&lt; endl; } /** * class-type conversion * 无显式返回类型 * 无形参 * ...

    深入解析C++中的动态类型转换与静态类型转换运算符

    主要介绍了C++中的动态类型转换与静态类型转换运算符,即dynamic_cast与static_cast的用法,需要的朋友可以参考下

    C++隐式类型转换运算符operator type()用法详解

    在阅读&lt;&lt;C&gt;&gt;的时候,在for_each()章节遇到下面代码, #include "algostuff.hpp" class MeanValue{ private: long num; long sum; ... MeanValue():num(0),sum(0){ ... void operator() (int elem){ ...

    C++中用于强制类型转换的四个运算符

    本文详细介绍了C++中的四个用与强制类型转换的运算符:用来修改类型的const 或volatile 属性的const_cast,用来修改操作数类型的reinterpret_cast,static_cast,dynamic_cast

    C++程序设计课件 ch10 运算符重载

    C++程序设计课件 第十章 运算符重载 10.1 什么是运算符重载 10.2 运算符重载的方法 10.3 重载运算符的规则 10.4 运算符重载函数作为类成员函数和友元函数 10.5 重载双目运算符 ...10.8 不同类型数据间的转换

    c++ 运算符重载和转换

    总结和演示了常见运算符重载的方法和注意事项,可供需要时查阅。

    C++中4种强制类型转换的区别总结

    使用标准C++的类型转换符:static_cast、dynamic_cast、reinterpret_cast和const_cast。 const_cast,字面上理解就是去const属性。 static_cast,命名上理解是静态类型转换。如int转换成char。 dynamic_cast,...

    c++基础(运算符和流程结构语句)

    "11dowhile语句和水仙花" "12for循环和水仙花" "13嵌套循环" "14九九乘法口诀" "15猜数字" "16goto语句" "01早读英语" "02总结" "03运算符表达式" "04运算符的有限级别" "05类型转换" "06if条件语句" "07三只小猪称...

    C++运算符重载的思维导图

    运算符重载 、运算符重载规则 1.重载运算符的限制 2.运算符重载的语法形 式 、用成员或友元函数重载运算符 1.一元运算符2.二元运算符 3.用成员函数重载运算符 4.用友元函数重载 ...三、几个典型运算符...2.类型转换函数

    C++类型转换归纳总结

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

    c++基础笔记:预处理命令、命名空间、转义字符、输入输出、数据类型、算数运算符、类型转换等

    本篇文章是博主在学习c++基础时所做第一篇笔记,适用于有一定c++学习基础的同学,有些地方是按照自己的学习习惯所作,...c++基础笔记:预处理命令、命名空间、转义字符、输入输出、数据类型、算数运算符、类型转换等。

    运算符重载(2013级-C++程序设计)0

    2013级,C++程序设计课件。第10章 运算符重载,内容 10.1 什么是运算符重载 10.2 运算符重载的方法 10.3 重载运算符的规则 10.4 运算符重载函数作为类成员函数和友元函数 ...10.8 不同类型数据间的转换

    详解C++编程中一元运算符的重载.doc

    转换运算符 后缀递增和递减运算符(++ 和 ––)在递增和递减中单独处理,下面会讲到。 以下规则适用于所有其他一元运算符。若要将一元运算符函数声明为非静态成员,则必须用以下形式声明它: ret-type operator op ...

    C++程序设计-谭浩强-清晰版完整书签

    2.5.5 强制类型转换运算符 35 2.6 赋值运算符与赋值表达式 36 2.6.1 赋值运算符 36 2.6.2 赋值过程中的类型转换 36 2.6.3 复合的赋值运算符 38 2.6.4 赋值表达式 39 2.7 逗号运算符与逗号表达式 40 习题 41

Global site tag (gtag.js) - Google Analytics