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. php 一个过虑xxs的代码

    一个过虑xxs的代码 public static function removeXSS($str) { $str = str_replace('<!-- -->', '', $str); ...

  2. mysql-5.7.12-winx64安装版配置、使用

    一.下载 http://dev.mysql.com/downloads/mysql/ 下载版本:Windows (x86,64-bit), ZIP Archive(mysql-5.7.12-winx6 ...

  3. 使用maven拆分项目

    在开发环境中,有时需要专人负责专门的模块,其他模块不需接触,这就需要将项目拆分,如下 fund_demo项目具有三个模块,现将主业务core模块单独提出另建一个项目fund_core,拆分时需要注意相 ...

  4. Lintcode---克隆二叉树

    深度复制一个二叉树. 给定一个二叉树,返回一个他的 克隆品 . 您在真实的面试中是否遇到过这个题? Yes 样例 给定一个二叉树: 1 / \ 2 3 / \ 4 5 返回其相同结构相同数值的克隆二叉 ...

  5. 使用Sigar获取服务器信息

    Sigar简介 Sigar是Hyperic-hq产品的基础包,是Hyperic HQ主要的数据收集组件.它用来从许多平台收集系统和处理信息. 这些平台包括:Linux, Windows, Solari ...

  6. delphi无边框可拖动窗体

    unit UFrmModless; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, ...

  7. redis基础之安装和配置(一)

    前言 折腾一下redis在linux环境的安装. ubantu16.04环境下安装 下载安装,依次执行命令; # 从官方网站下载安装包,注意,当前在哪个目录下执行命令,下载的包将在哪个目录下 $ wg ...

  8. location 禁止多目录

    [root@web01 default]# mkdir cron templates [root@web01 default]# tree . ├── cron └── templates direc ...

  9. linux 终端 查看上一页

    问题描述: 我在终端中使用”dpkg -l”命令显示主机中安装的软件时,发现内容很多,而当命令执行完毕后,只显示终端最后一屏的内容.前面的都无法查看,这个是很让人憋屈的.下面就这一个问题说一下我的解决 ...

  10. CXCommon.h工具类

    #ifndef __XCOMMON_H__ #define __XCOMMON_H__ /******************************************************* ...