【发布时间】:2020-05-21 19:51:42
【问题描述】:
在理解 C++ 中的强制转换概念时遇到了一点麻烦。使用指针时强制转换是如何工作的?什么时候投射编译时间问题或运行时间问题?
// class type-casting
#include <iostream>
using namespace std;
class CDummy {
float i,j;
};
class CAddition {
int x,y;
public:
CAddition (int a, int b) { x=a; y=b; }
int result() { return x+y;}
};
int main () {
CDummy d;
CAddition * padd;
padd = (CAddition*) &d;
cout << padd->result();
return 0;
}
【问题讨论】:
-
提示:不要在 C++ 中进行 C 样式转换。使用
static_cast<...>。我不确定这里的意图是什么,因为转换该指针是未定义的行为,所以从那时起这几乎是垃圾代码。您对padd所做的一切都不可信。 -
FWIW,您的代码是非法的并且具有未定义的行为。除某些情况外,您不能将一个对象投射到另一个对象。
-
您可能想要查看转换与强制转换,例如编写一个将
const CDummy&作为参数的CAddition构造函数。这意味着您可以执行CAddition a = d之类的操作。 -
Java 不是 C++,C++ 也不是 Java。在 Java 中有效的东西与 C++ 完全无关。 C++ 是一种低级得多的语言,当您进行 C 样式转换时,它只会完全按照您所说的执行,而不管后果如何。 Java 将坚决拒绝做某些事情。如果您想多次攻击自己的脚,C++ 将不碍事。我建议在调试器中浏览这段代码,看看在调试视图中
padd指针是如何被彻底破坏的。 -
我对铸造的建议:不要,至少在你有坚实的 C++ 基础之前不要。 C++ 不是一种安全的语言,它会让你在内存中胡思乱想。除非您正在处理继承链或强制转换基本类型,否则在您真正了解 C++ 抽象机的工作原理之前,我会推迟强制转换。其中一些good C++ books 确实可以为您提供这些知识,并且他们会检查演员阵容以及与之相关的所有陷阱。