【问题标题】:Type conversion in C++: related and unrelated typesC++ 中的类型转换:相关和不相关类型
【发布时间】:2014-01-05 06:31:07
【问题描述】:

我在阅读 Bjarne Stroustrup 的《The C++ Programming Language》来学习 C++ 时遇到了以下段落:

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

对我来说,不清楚是什么决定了任何两个给定类型相关或不相关,并且提到的示例似乎并不详尽。

Stroustrup 说类型分为 1.算术类型 2.用户定义类型和 3.内置类型,从上面的例子中,他认为算术类型(int)与用户定义类型有关(枚举)。将浮点类型转换为 int 很明显,因为它们都是算术类型。

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

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

【问题讨论】:

  • 阅读“更有效的 C++ ~ Scott Meyers” 第 2 项

标签: c++


【解决方案1】:

在下面的示例中,类型 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()

【讨论】:

  • 感谢您的回答。 :-) 对于类,这似乎很明显,因为它们的依赖关系可以很容易地确定。我把我的问题改了一点,更准确、更清楚,请看一下。
  • 为什么你认为你在代码中定义的某个类/结构/类型定义的指针是内置类型?
【解决方案2】:

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

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

该文本似乎有点被错误引用,因为它似乎暗示(整数类型和枚举类型)以及(浮点类型和整数类型)是相关的。 我认为文字的意思是这样的:

static_cast 运算符在指向相关类型的指针之间进行转换(向上转换和向下转换,无需运行时类型检查),将整数类型转换为枚举,...。

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

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

【讨论】:

  • cppreference.com 怎么样? static_castreinterpret_cast
  • cppreference.com 是一个很好的参考来源。我选择使用 cplusplus.com 作为参考,因为 cppreference.com 更严格地遵循标准,因此没有提到 related types,而 cplusplus.com 在 OP 询问的上下文中提到了 related types
猜你喜欢
  • 1970-01-01
  • 2014-07-04
  • 1970-01-01
  • 1970-01-01
  • 2015-09-23
  • 2021-11-19
  • 1970-01-01
  • 2019-02-07
  • 2018-02-01
相关资源
最近更新 更多