c++的强制类型转换

在C和C++中,强制类型转换时常出现,例如:

void Test ()
{
     int i = 1;     // 隐式类型转换
     double d = i;
     printf("%d, %.2f\n" , i, d);

     int* p = &i; // 强制类型转换
     int address = (int) p;

     printf("%x, %d\n" , p, address);
}

所以,强制类型转化时常存在,故而C++风格的类型转换提供了4种类型转换操作符来应对不同场合的应用。它们分别是const_caststatic_castdynamic_castreinterpreter_cast

reinterpret_cast操作符用于将一种类型转换为另一种不同的类型。例如

typedef void (* FUNC)();

int DoSomething (int i)
{
     cout<<"DoSomething" <<endl;
     return 0;
}

reinterpret_cast可以编译器以FUNC的定义方式去看待 DoSomething函数, 所以非常的BUG,下面转换函数指针的代码是不可移植的,所以不建议这样用,并且C++不保证所有的函数指针都被一样的使用,所以这样用有时会产生不确定的结果。

void Test ()
{
     FUNC f = reinterpret_cast< FUNC>(DoSomething );
     f();
}

const_cast最常用的用途就是删除变量的const属性,方便赋值。

void Test ()
{
     volatile const int tem = 3;
     int* p = const_cast< int*>(&tem );
     *p = 8;

     cout<<tem<<endl;
}

dynamic_cast用于将一个子类对象的指针转换为父类对象的指针或引用(动态转换)

向上转型:子类对象->父类指针/引用(不需要转换)

向下转型:父类对象->子类指针/引用(用dynamic_cast转型是安全的)

一. dynamic_cast只能用于含有虚函数的类

二. dynamic_cast会先检查是否能转换成功,能成功则转换,不能则返回0

class A
{
public :
     virtual void Test(){}
};

class B : public A
{};

void fun (A* pa)
{
   
   B* pb1 = static_cast<B*>(pa);
   B* pb2 = dynamic_cast<B*>(pa);
   

   cout<<"pb1:" <<pb1<< endl;
   cout<<"pb2:" <<pb2<< endl;
}

static_cast类似于C风格的强制转换。无条件转换,静态类型转换。用于:

  1. 基类和子类之间转换:其中子类指针转换成父类指针是安全的;但父类指针转换成子类指针是不安全的。(基类和子类之间的动态类型转换建议用dynamic_cast)

2. 基本数据类型转换。enum, struct, int, char, float等。static_cast不能进行无关类型(如非基类和子类)指针之间的转换。

  3. 把空指针转换成目标类型的空指针。

  4. 把任何类型的表达式转换成void类型。

  5. static_cast不能去掉类型的const、volitale属性(用const_cast)。

以上便是对四种函数的浅析,如有不足,请多多指教

时间: 2025-01-02 00:36:25

c++的强制类型转换的相关文章

C++强制类型转换操作符 const_cast

const_cast也是一个强制类型转换操作符.<C++ Primer>中是这样描述它的: 1.将转换掉表达式的const性质. 2.只有使用const_cast才能将const性质性质转化掉.试图使用其他三种形式的强制转换都会导致编译时的错误.(添加const还可以用其他转换符,如static_const) 3.除了添加const或删除const特性,使用const_cast符来执行其他任何类型的转换都会引起编译错误.(volatile限定符也包括,不过我不怎么了解,本文主要说const)

C++中的向上类型转换和向下类型转换+四种强制类型转换

转自博客:http://blog.csdn.net/wangweitingaabbcc/article/details/7720979# 在c++的世界中有这样两个概念,向上类型转换,向下类型转换,分别描述的是子类向基类,和基类向子类的强制类型转换. 向上强制类型转换 切割:覆盖方法和子类数据丢失的现象生成切割(slice) class Base { public: int b; virtual void Test() { cout << "base" <<en

C++强制类型转换:static_cast、dynamic_cast、const_cast、reinterpret_cast

1. c强制转换与c++强制转换 c语言强制类型转换主要用于基础的数据类型间的转换,语法为: (type-id)expression//转换格式1 type-id(expression)//转换格式2 c++除了能使用c语言的强制类型转换外,还新增了四种强制类型转换:static_cast.dynamic_cast.const_cast.reinterpret_cast,主要运用于继承关系类间的强制转化,语法为: static_cast<new_type> (expression) dynam

java中强制类型转换时,高位数截取成低位数的方法

/** * 强制类型转换中的补码.反码.原码一搞清楚 */ int b=233;//正整数强转 System.out.println((byte)b); //负数:原码的绝对值取反再加一 符号为不变 //00000000 00000000 00000000 11101001 // 1110 1001 补码 // 1110 1000 反码 // 1001 0111 原码 1+2+4+16 =-23 b=-233;//负整数强转 //10000000 00000000 00000000 111010

js类型转换-字符串转整型、浮点型方法、强制类型转换等

1. 转换函数: js 提供了parseInt()和parseFloat()两个转换函数.前者把值转换成整数,后者把值转换成浮点数.只有对String类型调用这些方法, 这两个函数才能正确运行:对其他类型返回的都是NaN(Not a Number).这两个转换函数的结果都是将String数据类型转化为Number. 在 判断字符串是否是数字值前,parseInt()和parseFloat()都会仔细分析该字符串.parseInt()方法首先查看位置0处的 字符,判断它是否是个有效数字:如果不是,

c++的四种强制类型转换

http://hb.qq.com/a/20110722/001452.htm ...... C风格的强制类型转换(Type Cast)很简单,不管什么类型的转换统统是:TYPE b = (TYPE)a C++风格的类型转换提供了4种类型转换操作符来应对不同场合的应用. const_cast,字面上理解就是去const属性或volatile属性. static_cast,命名上理解是静态类型转换.如int转换成char. 类似于C风格的强制转换.无条件转换,静态类型转换.用于: 1. 基类和子类之

java的自动类型转换和强制类型转换

一.自动类型转换 在 Java 程序中,不同的基本数据类型的数据之间经常需要进行相互转换.例如: , 代码中 int 型变量 score1 可以直接为 double 型变量 score2 完成赋值操作,运行结果为: 82.0  这种转换称为自动类型转换. 当然自动类型转换是需要满足特定的条件的:目标类型大于元类型 二.强制类型转换 当程序中需要将 double 型变量的值赋给一个 int 型变量,该如何实现呢? 显然,这种转换是不会自动进行的!因为 int 型的存储范围比 double 型的小.

C语言中将0到1000的浮点数用强制类型转换的方式生成一幅图像

搞过计算机图像的人都知道,图像中的每一个像素通常为一个整型数,它可以分成4个无符号的char类型,以表示其RGBA四个分量.一幅图像可以看做是一个二维整型数组.这里我会生成一个float数组,其数组大小为1000000,刚好1000*1000,数组内的浮点数的数值范围在0到1000.0之间,呈等差数组排列,相邻两数的差为0.001.然后将其每一个浮点数强制转化成一个整型数或三个unsigned char型,以决定像素的RGB三个通道分量,看看其生成的图像是什么样子. 前几天写了一篇文章是在C语言

C++中4种强制类型转换

不过为了完成强制类型转换,C++中已经为我们提供了4中标准方法,它们是dynamic_cats, static_cast, const_cast, reinterpret_cast,用法形式为:dynamic_cast<类型说明符>(表达式),之所以分成4类,就表示他们各自有着不同的使用环境,下面转载的文章会有详细的说明. const_cast,字面上理解就是去const属性.static_cast,命名上理解是静态类型转换.如int转换成char.dynamic_cast,命名上理解是动态类

今天聊一聊Java引用类型的强制类型转换

实际上基本类型也是存在强制类型转换的,这里简单提一下.概括来讲分为两种: 1.自动类型转换,也叫隐式类型转换,即数据范围小的转换为数据范围大的,此时编译器自动完成类型转换,无需我们写代码 2.强制类型转换,也叫显式类型转换,即数据范围大的转换为数据范围小的,此时数据会损失精度,强转也需要我们书写代码来实现,使用需谨慎 下面我们来看看,引用类型的强制类型转换: 同样分两种:隐式和显式 1.隐式强转,就是父类的引用指向子类的对象,例如 Father类和Child类,我们可以这样写: Father f