四种类型转换符

Posted im18620660608

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了四种类型转换符相关的知识,希望对你有一定的参考价值。

C++中常见的面试题.

题目: 关于C++中, 四种类型转换的关键字, 的详解, 也可以给出代码, 判断输出 或 判断哪些代码有误.

 

答案及范例如下:

 

四种关键字: const_cast, 常量性转除;dynamic_cast, 向下安全转型;reinterpret_cast, 重新解释转型static_cast, 静态转型;

1. const_cast, 常量性转除:

主要对变量的常量性(const)进行操作, 移除变量的常量性, 即可以被非常量指向和引用, 详见代码;

2. dynamic_cast, 向下安全转型:

主要应用于继承体系, 可以由 指向派生类的基类部分的指针, 转换指向派生类指向兄弟类;

static_cast只能转换为指向派生类;

3. reinterpret_cast, 重新解释转型:

主要是对2进制数据进行重新解释(re-interpret),不改变格式, 而static_cast会改变格式进行解释;

由派生类转换基类, 则重新解释转换, 不改变地址, 静态转换改变地址;

4. static_cast, 静态转型:

主要是数据类型的转换, 还可以用于继承;

 

代码如下:

 

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

/*

 * cppprimer.cpp

 *

 *  Created on: 2014.2.10

 *      Author: Spike

 */

 

/*eclipse cdt, gcc 4.8.1*/

 

#include <iostream>

 

/*常量性移除指针详解*/

 

struct S

    S() : value(0)

    int value;

;

 

void CastConst (void)

    const S s;

    std::cout << s.value =  << s.value << std::endl;

    //S* ps = &s; //error, 指向常量

    S* ps = const_cast<s*>(&s);

    ps->value = 1;

    std::cout << s.value =  << s.value << std::endl;

    //S& rs = s; //error, 引用常量

    S& rs = const_cast<s&>(s);

    rs.value = 2;

    std::cout << s.value =  << s.value << std::endl;

 

/*安全向下转型*/

 

struct B /*基类B*/

    virtual void f() std::cout << Base::f << std::endl;

    void thisf() std::cout << Base::thisf << std::endl;

    virtual ~B()

;

 

struct B2 /*基类B2*/

    virtual void g() std::cout << Base2::g << std::endl;

    void thisg() std::cout << Base2::thisg << std::endl;

    virtual ~B2()

;

 

struct D : public B, public B2 /*派生类D*/

    virtual void f() std::cout << Derived::f << std::endl;

    virtual void g() std::cout << Derived::g << std::endl;

    virtual ~D()

;

 

void CastDynamic (void)

     B* pB_D = new D;

     pB_D->f();

     //pD->g(); //error, 只包含B部分

 

     D *pD_D = dynamic_cast<d*>(pB_D); //转换为派生类

     pD_D->g();

     B2* pB2_D = dynamic_cast<b2*>(pB_D); //转换为兄弟类

     pB2_D->g();

 

     D *pD_Ds = static_cast<d*>(pB_D);

     pD_Ds->g();

     //B2* pB2_Ds = static_cast<b2*>(pB_D); //error, 不能转换为兄弟类

 

/*重新解释转型*/

 

struct rA int m_a; ;

struct rB int m_b; ;

struct rC : public rA, public rB ;

 

void CastReinterpret (void)

    int *i= new int;

    *i = 10;

    std::cout << *i =  << *i << std::endl;

    std::cout << i =  << i << std::endl;

    double *d=reinterpret_cast<double*> (i);

    std::cout << *d =  << *d << std::endl;

    std::cout << d =  << d << std::endl;

 

    rC c;

    std::cout << &c =  << &c << std::endl

            << reinterpret_cast<rb*>(&c) =  <<reinterpret_cast<rb*>(&c) << std::endl

            << static_cast <rb*>(&c) =  << static_cast <rb*>(&c) << std::endl

            << reinterpret_cast<ra*>(&c) =  <<reinterpret_cast<ra*>(&c) << std::endl

            << static_cast <ra*>(&c) =  << static_cast <ra*>(&c) << std::endl

            << std::endl;

 

int main (void)

    std::cout << std::endl << 常量性转除: << std::endl;

    CastConst();

    std::cout << std::endl << 安全向下转型: << std::endl;

    CastDynamic();

    std::cout << std::endl << 重新解释转型: << std::endl;

    CastReinterpret();

</ra*></ra*></reinterpret_cast<ra*></ra*></rb*></rb*></reinterpret_cast<rb*></rb*></double*></b2*></d*></b2*></d*></s&></s*></iostream>

 

输出:

 

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

常量性转除:

s.value = 0

s.value = 1

s.value = 2

 

安全向下转型:

Derived::f

Derived::g

Derived::g

Derived::g

 

重新解释转型:

*i = 10

i = 0x471718

*d = 2.55917e-307

d = 0x471718

&c = 0x22feb0

reinterpret_cast<rb*>(&c) = 0x22feb0

static_cast <rb*>(&c) = 0x22feb4

reinterpret_cast<ra*>(&c) = 0x22feb0

static_cast <ra*>(&c) = 0x22feb0

</ra*></ra*></rb*></rb*>

 

 

https://www.cnblogs.com/daocaorenblog/p/5279077.html

以上是关于四种类型转换符的主要内容,如果未能解决你的问题,请参考以下文章

C++|项目开发—强制类型转换回顾

C#中方法的参数的四种类型

__block修饰符(四)

C++C++的四种类型转换

c++的四种强制类型转换

C++ 的四种类型转换