首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用指针在C++中进行铸造

用指针在C++中进行铸造
EN

Stack Overflow用户
提问于 2020-02-05 20:25:05
回答 1查看 85关注 0票数 0

在理解C++中的铸造概念时遇到了一些困难。当使用指针时,转换是如何工作的?何时强制转换编译时问题或运行时问题?

代码语言:javascript
复制
// 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;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-02-05 20:42:16

我想了解更多关于在c++中的铸造的一般情况。它看起来比具有类型检查和JVM的Java要难得多。

C++确实检查类型。通过使用c样式的强制转换,可以显式地请求绕过类型系统提供的所有安全性。您不应该在C++中使用c样式的强制转换,而应该在static_castdynamic_cast中使用,在很少的情况下使用const_cast,在更少见的情况下使用reinterpret_cast

如果你更换你的c型演员

代码语言:javascript
复制
padd = (CAddition*) &d;

使用C++强制转换:

代码语言:javascript
复制
padd = static_cast<CAddition*>(&d);

然后编译器会告诉您您所做的是错误的:

代码语言:javascript
复制
prog.cc:19:36: error: invalid static_cast from type 'CDummy*' to type 'CAddition*'
   padd = static_cast<CAddition*>(&d);

我认为这是再清楚不过的了:CDummy*不是CAddition*,所以您不应该在这些类型之间进行转换。

因为你知道,你的代码有未定义行为。C++标准和编译器都不愿意对具有未定义行为的代码执行任何有意义的操作(因此名称:它根本没有定义您将得到什么)。

在您的示例中,可以提供一个转换:PS

代码语言:javascript
复制
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++中只会使事情变得更糟。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60083587

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档