C++ Code 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
 
/*
    名称:C++强制类型转换:static_cast、const_cast 、dynamic_cast、reinterpret_cast
    作者:Michael Joessy 
    日期:2017-06-05
    知识:
    C: 强制类型转换的一般形式为:(类型名)(表达式)
    使用C风格的强制转换可以把想要的任何东西转换成合乎心意的类型。那为什么还需要一个新的C++类型的强制转换呢?
    新类型的强制转换可以提供更好的控制强制转换过程,允许控制各种不同种类的强制转换。
    C++中风格是static_cast<type>(content)。
    C++风格的强制转换其他的好处是,它们能更清晰的表明它们要干什么。
    程序员只要扫一眼这样的代码,就能立即知道一个强制转换的目的。
*/

#include <iostream>
using namespace std;

class A
{};
class B:public A
{};
class C
{};

class D  
{  
public:  
    int m_iNum;  
    virtual void foo()
    {

}
};

class E:public D  
{  
public:  
   ];  
};

int main(void)
{

/************************************************************************/
    /* static_cast
    /* 用法:static_cast<type-id>(expression) 
    /* static_cast:可以实现C++中内置基本数据类型之间的相互转换。
    /* 如果涉及到类的话,static_cast只能在有相互联系的类型中进行相互转换,不一定包含虚函数。
    /************************************************************************/
    ;
    int nTest = static_cast<int>(dTest);

A* a = new A;
    B* b;
    C* c;
    b = static_cast<B*>(a);      // 编译不会报错, B类继承A类
    //c = static_cast<B*>(a);    // 编译报错, C类与A类没有任何关系

/************************************************************************/
    /* const_cast
    /* 用法:const_cast<type_id> (expression)
    /* const_cast: const_cast操作不能在不同的种类间转换。
    /* 相反,它仅仅把一个它作用的表达式转换成常量。
    /* 它可以使一个本来不是const类型的数据转换成const类型的,或者把const属性去掉。

    /************************************************************************/
    const A *pa = new A;                 // const对象    
    A *pb;                                 // 非const对象    
    //pb = pa;                           // 这里将出错,不能将const对象指针赋值给非const对象    
    pb = const_cast<A*>(pa);        // 现在OK了

/************************************************************************/
    /* dynamic_cast
    /* 用法:dynamic_cast<type-id>(expression)
    /* Type-id必须是类的指针、类的引用或者void *;
    /* 如果type-id是类指针类型,那么expression也必须是一个指针,如果type-id是一个引用,那么expression也必须是一个引用。
    /* dynamic_cast主要用于类层次间的上行转换和下行转换,还可以用于类之间的交叉转换。
    /* dynamic_cast是运行时处理的,运行时要进行类型检查。
    /* 不能用于内置的基本数据类型的强制转换。
    /* dynamic_cast转换如果成功的话返回的是指向类的指针或引用,转换失败的话则会返回NULL。
    /* 使用dynamic_cast进行转换的,基类中一定要有虚函数,否则编译不通过。
    /************************************************************************/
    D* pd = new D;
    E* pe1 = static_cast<E*>(pd);  
    E* pe2 = dynamic_cast<E*>(pd);   // 更安全

/************************************************************************/
    /* reinterpret_cast
    /* 用法:reinpreter_cast<type-id>(expression)
    /* 有着和C风格的强制转换同样的能力。
    /* 它可以转化任何内置的数据类型为其他任何的数据类型,也可以转化任何指针类型为其他的类型。
    /* 它甚至可以转化内置的数据类型为指针,无须考虑类型安全或者常量的情形。不到万不得已绝对不用。
    /* 使用reinterpret_cast 的场合不多,仅在非常必要的情形下,其他类型的强制转换不能满足要求时才使用。
    /************************************************************************/
    ;   
    double dNum1 = static_cast<double>(nInt);     
    double dNum2 = reinterpret_cast<double&>(nInt);  // 不提倡...

cin.get();
    ;
}

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

  1. java中强制类型转换

    在Java中强制类型转换分为基本数据类型和引用数据类型两种,这里我们讨论的后者,也就是引用数据类型的强制类型转换. 在Java中由于继承和向上转型,子类可以非常自然地转换成父类,但是父类转换成子类则需 ...

  2. C++强制类型转换

    C语言强制类型转换过于粗暴,任意类型之间都可以进行转换,编译很难判断其正确性; 难于定位,在源码中无法快速定位所有使用强制类型转换的语句. C++将强制类型转换分为4种不同的类型:static_cas ...

  3. java提高篇(十一)-----强制类型转换

    在java中强制类型转换分为基本数据类型和引用数据类型两种,这里我们讨论的后者,也就是引用数据类型的强制类型转换. 在Java中由于继承和向上转型,子类可以非常自然地转换成父类,但是父类转换成子类则需 ...

  4. JavaScript学习10 JS数据类型、强制类型转换和对象属性

    JavaScript学习10 JS数据类型.强制类型转换和对象属性 JavaScript数据类型 JavaScript中有五种原始数据类型:Undefined.Null.Boolean.Number以 ...

  5. C++强制类型转换操作符 dynamic_cast

    dynamic_cast是四个强制类型转换操作符中最特殊的一个,它支持运行时识别指针或引用. >>>>>>>>>>>编译器的RTTI设 ...

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

    const_cast也是一个强制类型转换操作符.<C++ Primer>中是这样描述它的: 1.将转换掉表达式的const性质. 2.只有使用const_cast才能将const性质性质转 ...

  7. C++强制类型转换操作符 static_cast

    static_cast是一个强制类型转换操作符.强制类型转换,也称为显式转换,C++中强制类型转换操作符有static_cast.dynamic_cast.const_cast.reinterpert ...

  8. Js里面的强制类型转换

    js 和 PHP语言一样是弱类型语言.近期我也在看C语言,并没有传说中那么难,既是书中一再强调的指针部分,也没有那么夸张.至少是理论和语法理解起来不是很难.看起来凡是什么东西,不要总是被别人的话迷惑了 ...

  9. c语言强制类型转换

    一.强制类型转换 printf("3/2+100.5=%f",3/2+100.5);//100.5错误表达 printf ("    (float)3/(float)2 ...

  10. 数据类型/强制类型转换 和运算符---标识符规则/关键字 a++和++a区别

    3.2关键字都是小写,TRUE FALSE NULL都不是Java关键字 3.3数据类型 变量相当于一个有名称的容器,该容器用于装各种不同类型的数据 Java类型分为2种 基本类型: 引用类型: 基本 ...

随机推荐

  1. Chrome内置的断网Javascript 小游戏脚本示范

    //示范面向对象 this 作用域 闭包 单例模式很好的示范 1 // Copyright (c) 2014 The Chromium Authors. All rights reserved. // ...

  2. c#(winform)中自定义ListItem类方便ComboBox添加Item项

    1.定义ListItem类 public class ListItem { private string _key = string.Empty; private string _value = st ...

  3. c语言中函数参数入栈的顺序是什么?为什么

    看到面试题C语言中函数参数的入栈顺序如何? 自己不知道,边上网找资料.下面是详细解释 #include <stdio.h> void foo(int x, int y, int z){   ...

  4. [CentOS] CentOS for vsftpd with MySQL Virtual user

    從ubuntu 12.04的安裝手法拿到CentOS來真的有些很大的不同 絕大部分的語法.概念都是差不多的,只是指令上有些差別,跟ubuntu 有不一樣的地方特別拿出來另外說明 要讓vsftpd與my ...

  5. Java数据结构和算法(三):常用排序算法与经典题型

    常用的八种排序算法 1.直接插入排序 我们经常会到这样一类排序问题:把新的数据插入到已经排好的数据列中.将第一个数和第二个数排序,然后构成一个有序序列将第三个数插入进去,构成一个新的有序序列.对第四个 ...

  6. Maven的个性化定制

    用Maven的小伙伴都知道,Maven的宗旨是约定优于配置(Convention Over Configuration). 在宗旨的前提下Maven也提供了个性化定制的Profile,让我们看看使用方 ...

  7. atitit.提升兼容性最佳实践 o9o

    atitit.提升兼容性最佳实践 o9o.doc 1. Atitit.兼容性的"一加三"策略 1 2. 扩展表模式 1 3. 同时运行模式 1 3.1. 完美的后向兼容性 2 3. ...

  8. jquery 修改 bootstrap模态框的宽度并且居中

    1.定义模态框 <div class="modal fade" id="Project_Cell_Modal" tabindex="-1&quo ...

  9. lodop简单入门教程

    lodop简单入门 1 安装(这个不介绍,下载安装即可) 声明只能装windows,linux不能装,所以linux 服务器要使用直接使用http://localhost:8000/CLodopfun ...

  10. jar 打包命令详解

    原文: https://blog.csdn.net/marryshi/article/details/50751764 本文详细讲述了JAR命令的用法,对于大家学习和总结jar命令的使用有一定的帮助作 ...