欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

5.C++里的4种新型类型转换

程序员文章站 2022-04-16 10:53:06
1首先来回顾C的强制转换 大家都知道,在编译C语言中的强制转换时,编译器不会检查转换是否成功,都会编译正确. 比如: 输出结果如下图所示: 从上图可以看到,只有当运行代码时,才会出现段错误问题. 当C代码上千行时,若出现这种问题,是非常难找的. 2.C++的新型类型转换 所以在C++中,便引入了4种 ......

1首先来回顾C的强制转换

大家都知道,在编译C语言中的强制转换时,编译器不会检查转换是否成功,都会编译正确.

比如:

#include "stdio.h"

struct Position
{
int x;
int y;
};

int main()
{
 int i;
 struct Position *p;

 i=0x123456;

 p=(struct Position *)i;

 printf("px=%d,py=%d\n",p->x,p->y);
}

 输出结果如下图所示:

 5.C++里的4种新型类型转换

从上图可以看到,只有当运行代码时,才会出现段错误问题.

C代码上千行,若出现这种问题,是非常难找的.

 

2.C++的新型类型转换

所以在C++,便引入了4强制类型转换

2.1 static_cast(静态类型转换)

  • 用于基本数据类型之间的转换(char,int,const int)
  • 不能用于基本数据类型指针之间的转换(char *,int *)
  • 用于有继承关系类对象之间的转换
  • 用于类指针之间的转换

例如:

    int i = 0x45;

    char c = 'c';

    c = static_cast<char>(i);    
    //char* pc = static_cast<char*>(&i);   //此行错误,不能用于基本指针之间转换

 

 

2.2 const_cast(去常类型转换)

  • 用于去除变量的只读属性
  • 且强制转换的类型必须是指针*引用&

例如:

const int x =1;     //const:定义一个常量x 

const int& j =2;    //const引用:定义一个只读变量j

int& p1= const_cast<int&>(x);   //强制转换int &

int *p2 = const_cast<int*>(&j);  //强制转换int*

//int p3 = const_cast<int>(j);    //此行错误,不能转换普通数据型

p1=3;
*p2=4;

printf("x=%d,   j=%d\n",x,j);
printf("p1=%d  *p2=%d\n",p1,*p2);

输出结果:

x=1   j=4

p1=3  *p2=4

从输出结果,可以看出修改p1,p2,只有j内容变换了,是因为变量jconst引用定义的,所以是个只读变量.

 

2.3 dynamic_cast(动态类型转换)

  • 用于有继承关系的类指针间的转换
  • 用于有交叉关系的类指针间的转换
  • 具有类型检查的功能
  • 需要虚函数的支持
  • 不能用于基本数据类型指针之间的转换(char *,int *)

 

2.4 reinterpret_ cast(解读类型转换)

  • 用于所有指针的强制转换

(解读是指:对要转换的数据进行重新的解读)

例如:

    int i = 0;

    char j='c';
int   *p1=reinterpret_cast<int *>(&i);

    char  *p2=reinterpret_cast<char *>(&j);

    //int  p3=reinterpret_cast<int >i;  //此行错误,不能转换普通数据型