栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++ 四类cast强制类型转换

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++ 四类cast强制类型转换

引言

C风格的类型转换有不少的缺点:

1. 它可以在任意类型之间转换,这两种转换之间的差别是巨大的,但是传统的c语言风格的类型转换没有区分这些.

2. C风格的转换不容易查找,他由一个括号加上一个标识符组成,(TYPE)EXPRESSION 而这样的东西在C++程序里一大堆。

C++为了克服这些缺点,引进了4新的类型转换操作符,他们是 static_cast 、const_cast 、dynamic_cast 、reinterpret_cast

一. const_cast

const_cast 用于去除 const(volatile)属性,将只读变为可读写

const_cast只针对指针、引用和this指针,其他情况的话就会出错,如下代码所示:

int n = 5;
int *k1 = const_cast(&n);  //指针
*k1 = 1;
int &k2 = const_cast(n);   //引用
k2 = 2;
int k3 = const_cast(n);  //编译出错
k3 = 1;                       //编译出错

注意:C++里是const,就是const,外界千变万变,我就不变

const int a = 10;
int* b = const_cast(&a);    
*b = 100;    //指针b的属性变成可读可写

上述代码中 *b 被修改为 100, 但是 a 的值仍为 10

Q:如果我们不想修改const变量的值,那我们又为什么要去const

A:我们可能调用了一个参数不是const的函数,而我们要传进去的实际参数确实const的,但是我们知道这个函数是不会对参数做修改的。于是我们就需要使用const_cast去除const限定,以便函数能够接受这个实际参数。

二. static cast

static_cast 第一个作用是代替隐式转换 ,比如:

1、void* 转换为任意类型的指针

2、任意类型的指针转换为void*

3、编译器允许的跨类型转换,比如char类型转换为int类型,double转int型   

int n = 10;
char c = 'a';
void *p = nullptr;
int *k = static_cast(p);
n = static_cast(c); //n就变成了97,ASCLL码中字符a的位置,    相当于int n = (int)c;

static_cast第二个作用是做基类与派生类的转换

派生类转换成基类是安全的,基类转换成派生类是不安全的,因为往往子类的内容比父类多。

static_cast可以将子类转换成父类,但是不提供安全性检查

class A{
public:
    void m() {};

};
class B:public A//普通继承 
{

};
int main() {
    A* aa;
    B* bb=static_cast (aa);//基类指针向下转换为派生类指针,不进行类型检查,不安全
    system("pause");
    return 0;
}
三. dymatic_cast

dynamic_cast和static_cast的效果是一样的。

但在进行下行转换时,dynamic_cast具有类型检查的功能,弥补了static_cast类型不安全的缺陷,比static_cast更安全。

dynamic_cast主要用于在多态的时候,它允许在运行时刻进行类型转换,从而使程序能够在一个类层次结构中安全地转换类型,把基类指针(引用)转换为派生类指针(引用)。

多用于有虚函数的基类与其派生类之间的转换,特点是进行运行时检测转换类型是否安全,如果转换失败返回nullptr,依赖于RTTI技术,但是有额外的函数开销,所以非必要的时候不使用。

class A{
public:
    virtual void m() {};// C现在是 多态

};
class B:public A 
{

};
int main() {
    A* aa;
    B* bb=dynamic_cast (aa);//基类指针向下转换为派生类指针
    system("pause");
    return 0;
}
四. reinterpret_cast

reinterpret_cast是四种强制转换中功能最为强大的,它可以暴力完成两个完全无关类型的指针之间或指针和数之间的互转,比如用char类型指针指向double值。它对原始对象的位模式提供较低层次上的重新解释(即reinterpret),完全复制二进制比特位到目标对象,转换后的值与原始对象无关但比特位一致,前后无精度损失。

reinterpret代替显示转换,用于转换各种高风险的转换(隐式转换无法转换的)。

但是不进行检查,只是进行强制的复制,有安全隐患,一般不用。

int main() {
    double d = 12.1;
    char* p = reinterpret_cast(&d); // 将d以二进制(位模式)方式解释为char,并赋给*p
    double* q = reinterpret_cast(p);
    cout << *q << endl; // 12.1
    system("pause");
    return 0;
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/968270.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号