在理解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;
}发布于 2020-02-05 20:42:16
我想了解更多关于在c++中的铸造的一般情况。它看起来比具有类型检查和JVM的Java要难得多。
C++确实检查类型。通过使用c样式的强制转换,可以显式地请求绕过类型系统提供的所有安全性。您不应该在C++中使用c样式的强制转换,而应该在static_cast、dynamic_cast中使用,在很少的情况下使用const_cast,在更少见的情况下使用reinterpret_cast。
如果你更换你的c型演员
padd = (CAddition*) &d;使用C++强制转换:
padd = static_cast<CAddition*>(&d);然后编译器会告诉您您所做的是错误的:
prog.cc:19:36: error: invalid static_cast from type 'CDummy*' to type 'CAddition*'
padd = static_cast<CAddition*>(&d);我认为这是再清楚不过的了:CDummy*不是CAddition*,所以您不应该在这些类型之间进行转换。
因为你知道,你的代码有未定义行为。C++标准和编译器都不愿意对具有未定义行为的代码执行任何有意义的操作(因此名称:它根本没有定义您将得到什么)。
在您的示例中,可以提供一个转换:PS:
class CAddition {
int x,y;
public:
CAddition (const CDummy& cd) : x(cd.i),y(cd.j) {}
CAddition (int a, int b) : x(a),y(b) {}
int result() { return x+y;}
};使用这样的转换构造函数,您可以很容易地从CDummy创建一个CAddition (您需要使成员在CDummy中使用public,或者提供一些其他方法来访问它们以使其工作)。
PPS --当上面我告诉你C++转换更安全时,我有点草率。他们仍然是一个很好的工具来射击自己的脚。需要转换通常是一种代码/设计的味道。不要通过在代码中放置强制转换而陷入沉默编译器警告/错误的陷阱。这在Java中可能很好,但在C++中只会使事情变得更糟。
https://stackoverflow.com/questions/60083587
复制相似问题