C++ 强制类型转换有四种关键字:static_cast、const_cast、reinterpret_cast和dynamic_cast。它们用于不同的情况和目的,比C语言的强制类型转换更清晰和安全。static_cast用于数据类型和继承关系类间的明确定义的转换,const_cast用于去掉或加上底层const,reinterpret_cast用于低级别的指针或整数的转换,dynamic_cast用于多态类间的转换.

static_cast

  • 基本使用:int a; static_cast<double>(a)

  • 使用范围:一般用于数据类型得强制转换,此外:

    • 基类与派生类(上行转换,派生-->基类,下行转换不安全)
    • 空指针转化为目标类型指针
    • 任何类型表达法转为void类型

const_cast

强制去掉不能被修改的常数特性(只能是指针或引用,而不能是变量数值)

尽量不要使用。

const int a = 10;

const int * p = &a;

int *q;

q = const_cast<int *>(p);

reinterpret_cast

使用范围:

  • 改变指针引用类型:

    int *a = new int;
    double *d = reinterpret_cast<double *>(a);
  • 整型与指针引用类型的相互转换

dynamic_cast

特点:运行时转换,需要做类型检查

范围:

  • 不能用于内置的基本数据类型的强制转换(static_cast)

  • 成功的话返回的是指向类的指针或引用,转换失败的话则会返回NULL

  • 使用dynamic_cast进行转换的,基类中一定要有虚函数,否则编译不通过.类中存在虚函数,就说明它有想要让基类指针或引用指向派生类对象的情况,此时转换才有意义.这是由于运行时类型检查需要运行时类型信息,而这个信息存储在类的虚函数表.只有定义了虚函数的类才有虚函数表。

  • 在类的转换时,在类层次间进行上行转换时,dynamic_cast和static_cast的效果是一样的。在进行下行转换时,dynamic_cast具有类型检查的功能,比static_cast更安全。

如下程序:

class Base{
void fun_a();
virtual void fun_b(); // 必须有一个虚函数才能被使用动态强制转换
}
class Derived:public Base{
void fun_c();
}
int main(){
Derived *p = new Base(); // error
Derived *p = static_cast<derived *>(new base); // compile true, but run error
p->fun_c();
Derived *p = dynamic_cast<derived *>(new base); // compile true, and p is NULL because call for function c not existed in Base class.
p->fun_c();
return 0;
}

C++11强制类型转换的更多相关文章

  1. python小白——进阶之路——day3天-———容器类型数据+Number类型强制类型转换

    -->Number 部分 int :     整型   浮点型 布尔类型  纯数字字符串 float:    整型   浮点型 布尔类型  纯数字字符串 complex:  整型   浮点型 布 ...

  2. python 基础之自动类型转换和强制类型转换

    一:自动类型转换 自动类型转换注意针对Number数据类型来说的 当2个不同类型的数据进行运算的时候,默认向更高精度转换 数据类型精度从低到高:bool int float complex #关于bo ...

  3. java的强制类型转换

    java强制类型转换  详细连接https://www.cnblogs.com/kuangwong/p/6198862.html 在Java项目的实际开发和应用中,常常需要用到将对象转为String这 ...

  4. C++之强制类型转换

     C++ Code  12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849 ...

  5. JAVA强制类型转换(转载+自己的感想) - stemon

    JAVA强制类型转换(转载+自己的感想) - stemon 时间 2013-10-29 15:52:00  博客园-Java原文  http://www.cnblogs.com/stemon/p/33 ...

  6. 强制类型转换(int)、(int&)和(int*)的区别

    我们先来看两行代码: float x=1.75,y=1.75; cout<<(int)x<<" "<<(int&)y<<en ...

  7. js字符串转换为数字的三种方法。(转换函数)(强制类型转换)(利用js变量弱类型转换)

    js字符串转换为数字的三种方法.(转换函数)(强制类型转换)(利用js变量弱类型转换) 一.总结 js字符串转换为数字的三种方法(parseInt("1234blue"))(Num ...

  8. javascript的强制类型转换

    1.toString (1)调用toString方法 Array是将数组中的每个元素字符串化,并使用逗号拼接起来 object返回的是内部属性[[Class]]的值,[object Object] n ...

  9. javascript之强制类型转换

    在javascript中,常会发生强制类型转换的情况有以下几种 字符串拼接 var a = 1; var b = a + '1'; console.log(b); //11 ==运算符 var a = ...

  10. 【C++】 四种强制类型转换(static_cast 与 dynamic_cast 的区别!)

    强制类型转换 1. static_cast 2. dynamic_cast 3. const_cast 4. reinterpret_cast 5. 为什么要需要四种类型转换? 1. static_c ...

随机推荐

  1. Java (新)将Excel数据读取到ListMap

    Java (新)将Excel数据读取到ListMap Maven依赖: pom.xml <!-- excel --> <dependency> <groupId>o ...

  2. CF 1272 D. Remove One Element

    D. Remove One Element time limit per test 2 seconds memory limit per test 256 megabytes input standa ...

  3. Reincarnation

    HDU4622 Now you are back,and have a task to do: Given you a string s consist of lower-case English l ...

  4. 量化交易 - matplotlib画candle图

    需要mplfinance包 pip install mplfinance --upgrade   from matplotlib import style import pandas as pd im ...

  5. java获取当前类的绝对路径

    转自: http://blog.csdn.net/elina_1992/article/details/47419097   1.如何获得当前文件路径 常用: (1).Test.class.getRe ...

  6. 艾思(aisi)软件主营业务介绍

    1. 移动应用开发 按客户端分类: APP定制开发 小程序定制开发 H5, Web定制开发 微信公众号开发 iOS开发 安卓开发 按行业分类(不限于): 电商, 单商户, 多商户商城 教育APP 聊天 ...

  7. ubuntu clean swap

    https://askubuntu.com/questions/1357/how-to-empty-swap-if-there-is-free-ram#:~:text=a single line-,s ...

  8. iframe页面加载完成为什么还是获取不到里面的dom

    iframe页面加载完成为什么还是获取不到里面的dom? 因为Iframe是跨域,跨域的情况下是无法获取到iframe里面的DOM的,即使iframe加载完成,也无法获取到里面的DOM. 有什么方法获 ...

  9. 转帖:弹性布局(display:flex;)属性详解

    它之所以被称为 Flexbox ,是因为它能够扩展和收缩 flex 容器内的元素,以最大限度地填充可用空间.与以前布局方式(如 table 布局和浮动元素内嵌块元素)相比,Flexbox 是一个更强大 ...

  10. 动态生成frame时需要对frame类进行注册,否则会出现找不到frame类的错误。

    procedure TMainForm.openFram(Caption, FormClassName, imgIdx: string); var i: integer; sheet: TUniTab ...