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. Java注解总结

    注解是Spring和Mybatis框架所大量使用的技术,要想掌握框架相关技术,注解是必须要掌握的. 掌握注解的优势: 1.能够读懂别人写的代码,特别是框架相关的代码. 2.本来可能需要很多配置文件,需 ...

  2. 在where子句中经常使用的运算符

    比较运算符 >   <   <=   >=   =    <> 大于.小于.大于(小于)等于.不等于 BETWEEN  ...AND... 显示在某一区间的值 IN ...

  3. MS SQL自定义函数IsPositiveInteger MS SQL自定义函数IsNumeric 水晶报表使用IEnumerable<T>数据源

    MS SQL自定义函数IsPositiveInteger   判断字符串是否为正整数,0开始的的数字不算. SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON ...

  4. c# 隐藏Tab控件的标签

    public void HideTabcontrolLabel(TabControl tabControl1) { tabControl1.Appearance = TabAppearance.Fla ...

  5. 给Editplus去掉.bak文件

    Tools-->Configure User Tools-->Files-->去掉create bacup file when saving前复选框的对号.

  6. Mysql 逻辑运算符详解

    逻辑运算符又称为布尔运算符,用来确认表达式的真和假.MySQL 支持4 种逻辑运算符,如表4-3 所示. 表4-3                          MySQL 中的逻辑运算符 运算符 ...

  7. node.js 操作excel 表格与XML文件常用的npm

    在日常工作中会经常用到把一些excel表格文件转化为json,xml,js等格式的文件,下面就是我在日常中用到的这些npm. 1.node-xlsx: node-xlsx可以把excel文件转化为上面 ...

  8. mysql误删root用户或者忘记root密码解决方法

    解决方法一: 到其他安装了Mysql的服务器(前提是要知道该服务器上Mysql的root用户密 码),打开[Mysql的安装目录/var/mysql],将其中的user.frm.user.MYD.us ...

  9. python WSGI框架详解

    1.web应用的本质1)浏览器发送一个HTTP请求2)服务器收到请求,生成一个HTML文档3)服务器把HTML文档作为HTTP响应的body发个浏览器4)浏览器收到HTTP响应,从HTTP Body取 ...

  10. ubuntu 16.04LTS

    安装出现"server64 busybox-initramfs安装失败" 这个是BUG,解决方法一:初次安装选择语言时,使用English,在后面还会有一个选择语言的界面,这时候再 ...