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++中的转换运算符重载,这是一个特殊类型的运算符重载,它使得类对象可以被隐式地转换为其他类型。 转换运算符(也称为类型转换运算符或类型构造函数)是一种特殊的成员函数,它没有参数,返回值...
C++类型转换运算符的实例详解 C++中有4个类型转换运算符,使装换过程更规范 dynamic_cast; const_cast; static_cast; reinterpret_cast; 一、dynamic_cast 该运算符我在之前的文章中已经介绍过了 //...
如果转换可能导致不可预见的行为或丢失信息,最好提供显式转换方法,如`ToDouble()`,而不是使用隐式类型转换运算符。 此外,C++还提供了其他类型的类型转换,比如`static_cast`、`dynamic_cast`、`const_cast`和`...
在C++编程语言中,函数重载(Overloading)和运算符重载(Overloading)是两种关键的多态性实现方式,而类型转化(Type Conversion)则涉及到数据类型的转换和兼容性问题。这些概念是C++程序员必备的知识点,理解和...
c++ 数据类型、运算符与表达式 C++语言的基本元素、字符集和关键字 基本的数据类型的表示方法 常量和变量 类型转换 各种运算符与表达式
总结,运算符重载是C++提供的一种强大工具,它使我们能够为自定义类型定制运算符的行为,但同时也需要谨慎处理类型转换和函数对象的使用,以确保代码的正确性和可维护性。通过熟练掌握这些概念和技巧,开发者可以...
2. `operator type()`:定义自定义类型到其他类型的转换,通常用作类型转换运算符。 五、类型转换与异常安全 在进行类型转换时,如果转换可能失败,最好使用异常来处理错误,这样可以保持程序的健壮性。 六、模板...
* 实现int类型转换为SamllInt类型 */ SmallInt(const int val): value(val) { cout << "SmallInt(const int val)" << endl; } /** * class-type conversion * 无显式返回类型 * 无形参 * ...
本资源“vc.zip”包含了一份关于C++类型转换的详细文档“vc.doc”,涵盖了从基本数据类型到复杂类型的转换方法。下面,我们将深入探讨C++中的类型转换及其重要性。 1. **静态类型转换**: - **C-style类型转换**:...
本篇文章将深入解析两种主要的类型转换运算符:动态类型转换(dynamic_cast)和静态类型转换(static_cast)。这两种转换方式在处理类层次结构和多态性时有各自的作用和适用场景。 首先,我们来看看静态类型转换...
例如,可以重载类型转换运算符将复数转换为字符串或其他类型。 例如,将复数转换为字符串的转换运算符可以这样实现: ```cpp class Complex { public: operator string() const { return "(" + to_string(real) ...
5. 强制类型转换(数据类型)(右到左):将表达式转换为指定的数据类型,例如 `(type)expression`。 6. 双目运算符(左到右): - 乘法、除法、取模、加法、减法、位移(左移和右移)。 - 比较运算符(大于、...
- C++引入了新的类型转换运算符,如 `static_cast<>`、`dynamic_cast<>`、`const_cast<>` 和 `reinterpret_cast<>`。这些运算符旨在提供更安全、更清晰的类型转换方式。由于它们是C++语言的关键部分,因此不允许被...
10. `reinterpret_cast` reinterpret 类型转换运算符 11. `new` 创建动态内存对象运算符 12. `delete` 释放对象运算符 13. `delete[]` 释放数组运算符 14. `noexcept` 能否抛出异常运算符 15. `sizeof` 对象大小...
类型转换运算符((type))是C++语言中的一种一元运算符,用于将变量的类型强制转换为其他类型。该运算符的结合方向是从右到左。 12. 长度运算符(sizeof): 长度运算符(sizeof)是C++语言中的一种一元运算符,...
C++运算符重载是指将操作符赋予新的意义,以便在用户定义的类中使用。运算符重载的目的在于将操作符添加到自已的类中,以方便类对象之间的运算,例如使用+、-、*、/等运算符。 为什么要重载操作符? --------------...
要将一个`BYTE`转换为其他基本类型,你可以直接赋值或使用强制类型转换运算符 `(type)`。例如,将`BYTE`转换为`int`: ```cpp BYTE byteValue = 123; int intValue = byteValue; //隐式转换 int intValue2 = ...