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. 【LeetCode】89. Gray Code (2 solutions)

    Gray Code The gray code is a binary numeral system where two successive values differ in only one bi ...

  2. centos增加软连接

    #增加软连接 ln -s /usr/local/git/bin/* /usr/bin/

  3. Redis全方位讲解--主从复制(转载)

    前言 前面介绍了redis持久化和容灾备份,这篇会介绍redis主从复制和redis持久化在主从复制中的一些应用.因为本人没有那么多服务器或机器,所以这里主要介绍下如何在docker容器中搭建主从复制 ...

  4. C#指南,重温基础,展望远方!(10)C#枚举

    枚举类型是包含一组已命名常量的独特值类型. 需要定义包含一组离散值的类型时,可以定义枚举. 枚举使用一种整型值类型作为其基础存储, 并提供离散值的语义含义. 以下示例声明并使用名为“Color”的 e ...

  5. 用Jedis操作redis示例一,Key,value HashMap

    简单的key,value形式 public class RedisDemo { public static void main(String[] args) { Jedis jedis = new J ...

  6. ExecuteScalar,ExecuteReader,ExecuteNonQuery区别

    ExecuteScalar is typically used when your query returns a single value. If it returns more, then the ...

  7. Atitit.各种 数据类型 ( 树形结构,表形数据 ) 的结构与存储数据库 attilax 总结

    Atitit.各种  数据类型 ( 树形结构,表形数据  ) 的结构与存储数据库 attilax  总结 1. 数据结构( 树形结构,表形数据,对象结构 ) 1 2. 编程语言中对应的数据结构 jav ...

  8. CYQ多数据库链接

     枚举名XXXEnum  对应XXXConn的配置数据库链接项 ,不多说,一看就明白!名字空间得要带上数据库名!

  9. OS开发UI篇—UIWindow简单介绍

    一.简单介绍 UIWindow是一种特殊的UIView,通常在一个app中只会有一个UIWindow iOS程序启动完毕后,创建的第一个视图控件就是UIWindow,接着创建控制器的view,最后将控 ...

  10. C++之在类内部访问对象的私有成员

    一.引言 今天看项目里的一段代码发现,竟然可以再类的成员函数中访问该类的对象的私有成员.感觉不可思议. 自己写的实例代码: #include <iostream> using namesp ...