C ++中的类型转换和指针的类型转换

时间:2020-07-28 13:19:09

标签: c++ pointers casting

我一直试图绕过类型转换和类型转换之间的差异。我了解到,基本上,当一种类型的基础值或位表示形式更改为另一种值时,我们就执行了转换。在纯类型转换中,我们只是告诉编译器将位模式视为另一种类型。我之所以使用“纯”,是因为强制转换可能会导致转化,在这种情况下,它被称为“显式转换”。

我想到了两个例子来说明这种差异。 首先:

float x = 1.5;
float* p1 = &x;
int* p2 = (int*) p1;
int i = *p2;

此处强制转换指针类型对指针值不执行任何操作。因此,它是纯铸件。在这种情况下,由于我们根据f1.5的位表示形式(确切地说是1069547520)获得int值,因此导致行为不确定。

第二:

B* b = new D();
D* d = static_cast<D*>(b);

其中D是从B派生的。此处,在第一行中进行了隐式转换。同样在第二行中,强制类型转换实际上是一次转换。这些转换是因为指针值可能会更改,如果有必要,可以调整该值以指向完整的D对象或B子对象(我还没有完全了解偏移量的工作原理)虽然。)

我可以正确地调用用户定义的类转换的指针强制转换吗?如果是这样的话,那么上面的static_cast也已经执行了一个转换(明确地),而我读过的这个答案完全转换了一个不同的概念:

https://stackoverflow.com/a/34268988/1219638-

标准转换是具有内置含义的隐式转换,并且是诸如static_cast或C样式强制转换之类的独立概念。

为什么将用户定义的类指针的转换称为标准转换?

我可以问最后一个问题吗?我了解到,当类型相关时,C样式的强制转换将像static_cast一样起作用。这是否意味着C样式强制转换也可以计算偏移量?

2 个答案:

答案 0 :(得分:5)

重要的是要理解,就C ++语言而言,您所谈论的区别并不存在。所有“ *_cast”(及其C等效项)都只是(显式)转换。对于该语言,所有转换都将创建一个新对象(如果转换为引用类型,则将创建对现有对象的新引用)。

指针是对象。 int* p2 = (int*) p1;执行reinterpret_cast,该操作将创建一个新的,不同类型的 pointer对象p2是与p1不同的对象,即使它们指向相同的内存也是如此。如果您执行了++p2,则绝不会影响p1指向的内容。

因此,从语言的角度来看,类型转换只是某些显式转换,这些转换使用的语法中包含单词“ cast”(或语法“ 等价”到语法中带有单词“ cast”的语法)它)。

您要做出的区分基本上是在转换返回与原始对象二进制相同的值时,以及在转换不返回时。好吧,C ++并不是真的 care ;所有(非参考)转换都返回一个新对象。当新对象与旧对象二进制相同时,C ++既不需要也不需要术语来描述转换。而且有很多“ *_cast”操作可能不会返回二进制相同的值,因此,即使有人希望创建这样的概念,将其称为“ cast”也会造成混淆。

为什么将用户定义的类指针的转换称为标准转换?

因为这就是C ++标准所称的名称。我并不是说我们称它们为“标准”,因为它们属于C ++标准。我的意思是C ++标准具有concept called "standard conversion",并且在指向类are part of that的某些类型的指针之间进行转换。

“标准转换”是可以隐式发生的转换(即:转换现场没有特殊语法)。指向派生类的指针可以隐式转换为指向可访问基类的指针。这是多态继承的一部分:某些代码可以在不确切知道其作用的类型的情况下对派生类实例进行操作的能力。多态基类提供了编写要使用的通用接口,而派生类则提供了该接口的各种实现。

答案 1 :(得分:2)

我一直在努力解决类型转换和类型转换之间的差异。

这是区别:

  • 类型转换是一个表达式。它会明确导致类型转换。
  • 转换包括显式转换和隐式转换。
  • 隐式转换不是由强制转换引起的。它们出现在表达式中……隐含地。

在这种情况下,它会导致不确定的行为

正确。

当我们根据f1.5的位表示形式获得int值时,准确地说是1069547520。

请注意,由于行为是不确定的,因此我们不能保证获得该精确值。程序的行为可以是任何东西。它可能会崩溃,无法构建,行为完全符合您的期望,甚至表现得完全不符合您的意愿。

我是否可以正确调用用户定义的类转换的指针转换?

调用转换类型很常见。尽管从技术上讲,强制转换会引起转换可能更为精确。

如果是这样,则上面的static_cast也已经执行了一次转换(明确地)

正确。

为什么将用户定义的类指针的转换称为标准转换?

因为它是一个指针,所以指针之间的转换是标准转换。

这是否意味着C样式强制转换也将计算偏移量?

是的。如果必须使用静态类型转换来计算偏移量,而使用C风格的类型转换来进行静态类型转换,则C风格的类型转换将计算偏移量。

P.S。不要使用C样式的强制类型转换。