C ++中的类型转换:相关和不相关的类型

时间:2014-01-05 06:31:08

标签: c++

我正在阅读Bjarne Stroustrup的“The C ++ Programming Language”来学习C ++并遇到以下段落:

  

static_cast运算符将相关类型(例如一个指针类型)转换为同一类层次结构中的另一个指针类型,枚举的整数类型或浮点类型转换为积分类型。 reinterpret_case处理无关类型之间的转换,例如指针的整数或指向不相关指针类型的指针。

对我来说,不清楚是什么决定任何两种给定类型是相关的还是不相关的,所提到的例子似乎并不详尽。

Stroustrup说类型分为1.算术类型2.用户定义的类型和3.内置类型,从上面的例子中,他认为算术类型(int)与用户定义的类型有关(ENUM)。浮点类型到int是显而易见的,因为它们都是算术类型。

然而,他根据他的定义将两个指针(根据他的定义应该是内置类型)分类为不相关的。

那么我们说“两种类型是相关的(不相关的)”是什么意思呢?

2 个答案:

答案 0 :(得分:3)

在下面的示例中,类型A和B是相关的,而类型A和C以及B和C是不相关的:

class A
{
    ...
};

class B : public A
{
    ...
};

class C
{
    ...
};

总的来说,我认为类型X和Y是相关的当且仅当以下条件之一成立时:

  • X继承自Y
  • Y继承自X
  • X有一个构造函数,它通过引用获取Y对象,意思是,X :: X(Y& y)
  • Y有一个构造函数,它通过引用获取X对象,意思是,Y :: Y(X& x)
  • X有一个到Y的转换运算符,意思是X :: operator Y()
  • Y有一个X的转换运算符,意思是Y :: operator X()

答案 1 :(得分:0)

如果两种类型通过继承方式属于同一个类层次结构,则它们是相关的。

  

static_cast运算符将相关类型(例如一个指针类型)转换为同一类层次结构中的另一个类型,枚举的整数类型或整数类型的浮点类型。 reinterpret_case处理不相关类型之间的转换,例如指针的整数或指向不相关指针类型的指针。

这个文本似乎有点错误引用,因为它似乎表明(整数类型和枚举类型)以及(浮点类型和整数类型)是相关的。 我认为文本应该说的是:

  

static_cast运算符在指向相关类型的指针之间进行转换(upcast以及downcast而不运行时类型检查),枚举的整数类型,....

     

reinterpret_cast运算符将任何指针类型转换为另一个指针类型,即使它们不相关,整数指针指向或......。

参考static_castreinterpret_cast的措辞似乎更清晰cplusplus.com

相关问题