类型转换运算符

一、概述

在c语言中的类型转换太过松散。例:

struct Data
{
	double data[200];
};
struct Junk
{
	int junk[100];
};
Data d={2.5e33,3.5e-19,20.2e32};
char * pch=(char *)(&d);//转换string
char ch = char(&d);//转换char
Junk * pj = (Junk *)(&d);//转换为Junk的指针

上述的类型转换过去松散,对于这种松散情况,c++提供了更严格地限制允许的类型转换,并添加4个类型转换运算符:

  1. dynamic_cast:动态转换。

  2. const_cast:常量转换。

  3. static_cast:静态类型转换。

  4. reinterpret_cast:重新解释转换。

可以根据目的的选择一个合适的运算符,而不是使用通用的类型转换。这指
出了进行类型转换的原因,并让编译器能够检查程序的行为是否与设计想法吻合。

二、四种转换

1.static_cast

语法:static-cast<type-name>(expression)

//仅当type_name可被隐式转换为expression所属的类型或expression可被隐式转换为type_name所属的类型时,上述转换才是合法的,否则出错。
#include<iostream>
using namespace std;
class Animal{};
class Dog:public Animal{};
class Other{};

//静态转换static_cast
void test1()
{
    //static_cast用作于 基本类型
    char ch = 'a';
    double d = static_cast<double>(ch);
    cout<<"d = "<<d<<endl;
    //static_cat 作用于 自定义数据类型(结构体 类)
     //关系的类之间
     //上行转换 安全
     Animal *p1 = static_cast<Animal *>(new Dog);
     //下行转换 不全 容易越界
    Dog *p2 = static_cast<Dog *>(new Animal);
    // static_cast 不能作用域 不相关的类之间转换
    //Animal *p3 = static_cast<Animal *>(new Other);//err

}
int main()
{
    test1();
    return 0;
}

在这里插入图片描述

2.dynamic_cast

语法:dynamic_cast<type-name>(expression)


//用途:使得能够在类层次结构中进行向上转换,而不允许其他转换。
class Animal{};
class Dog:public Animal{};
class Other{};

 //dynamic_cast动态转换
void test02()

{
     //1、dynamic_cast不支持 基本类型
     char ch = 'a';
     //double d=dynamic_cast<double>(ch);//err

    //2、dynamic_cast 上行转换 (基类指针 指向 派生类空间 安全)
     Animal *p1 = dynamic_cast<Animal *>(new Dog);
    //3、dynamic_cast 下行转换 (派生类指针 指向 基类空间 不安全)
    //Dog *p2 = dynamic_cast<Dog *>(new Animal);//不支持 不安全 的转换
     //4、dynamic_cast 不支持 没有关系的 类型转换
     //Animal *p3 = dynamic_cast<Animal *>(new Other);//err
}
int main()
{
    test02();
    return 0;
}

3.const_cast

语法:const_cast<type-name>(expression),type-name和expression的类型必须相同


//用途:改变值为const或volatile
class Animal{};
class Dog:public Animal{};
class Other{};

 //常量转换const_cast
 void test03()
{
    const int *p = NULL;
 int *p1 = const_cast<int *>(p) ;
     int *p2 = NULL;
     const int *p3 = const_cast<const int *>(p2);
     //const_cast 不支持 非指针或引用的转换
     const int a = 100;
     //int b = const_cast<int>(a);//err
     int data = 100;
     //常量引用 转换成 普通引用
     const int &ob = data;
     int &ob2 = const_cast<int &>(ob);
}
int main()
{
    test03();
    return 0;
}
4.reinterpret_cast

语法:reinterpret_cast<type_name>(expression)

//用途:用于天生危险的类型转换。它不允许删除const,但会执行其他令人生厌的操作。使用运算符可以简化对这种行为的跟踪工作。
#include<iostream>
using namespace std;
class Animal{};
class Dog:public Animal{};
class Other{};
void test04()
{
    //reinterpret_cast 不支持基本数据类型
    char ch='a';
    //double d = reinterpret_cast<double>(ch);//err
     //reinterpret_cast 支持 不相关的类型间转换
    Animal *p1 = reinterpret_cast<Animal *>(new Other);
     //上行转换 12 Animal *p2 = reinterpret_cast<Animal *>(new Dog);
     //下行转换 15 Dog *p3 = reinterpret_cast<Dog *>(new Animal);
     }
int main()
{
    test04();
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值