首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >你为什么能做这个转换?

你为什么能做这个转换?
EN

Stack Overflow用户
提问于 2017-06-08 07:48:47
回答 3查看 73关注 0票数 1

为什么你能这样做:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Dummy {
    double i,j;
};

class Addition {
    int x,y;
  public:
    Addition (int a, int b) { x=a; y=b; }
    int result() { return x+y;}
};

int main () {
  Dummy d;
  Addition * padd;
  padd = (Addition*) &d;
  cout << padd->result();
  return 0;
}

padd = (Addition*) &d;在事后使用时会生成运行时错误,为什么它是有效的?引用cplusplus.com的话:

不受限制的显式类型转换允许将任何指针转换为任何其他指针类型,而不依赖于它们所指向的类型。

但是,如果您在引用之前使用强制转换操作符,为什么可以将任何指针转换为任何其他指针类型?

谈到铸造操作符,它如何将所有类型转换为另一种类型?它是否调用了转换构造函数,因为如果是的话,我没有得到它,因为DummyAddition都没有转换构造函数,那么这个操作是如何工作的呢?它有多少个操作符,它是否是操作符本身的括号,就像=是一个运算符。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-06-08 07:54:48

这些类型的强制转换是C型铸型,可以让您将任何东西都抛给其他任何东西。强制转换是对编译器的一种语句,它忽略了编译器的类型、安全规则和您最熟悉的信任。这有时是必要的,当类型系统无法获得它需要的所有信息,以得出正确的结论。但是,如果在某些类型上对编译器撒谎,则会产生未定义的行为。

在c++中,您应该避免预先形成C风格的转换,而更喜欢更安全的c++替代方案(列出这里 )。这些类型不能完全保护你不受自己的影响,但它们确实允许你交流你想要的那种类型的演员。使用这些额外的信息,编译器可以警告您,如果您的强制转换会做一些您希望它们做的事情。

票数 2
EN

Stack Overflow用户

发布于 2017-06-08 07:53:32

当你使用:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
padd = (Addition*) &d;

编译器假设你,负责的人,知道你在做什么。如果你朝自己的脚开枪,那是你自己选择的。编译器很乐意让您这样做。

如果您想让编译器防止您遇到这样的意外情况,请使用static_cast

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
padd = static_cast<Addition*>(&d);

编译器会让您知道这是不对的。

票数 1
EN

Stack Overflow用户

发布于 2017-06-08 07:54:26

如果使用C样式强制转换,则不检查指针之间的错误或兼容性。另外,我认为您误解了一元运算符&的目的,在这种情况下,它给出了d的地址,并且与引用无关。

内存中的对象只是程序知道的某种类型的位,如果您告诉它它是另一种类型,它将不会影响变量中的任何内容。

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

https://stackoverflow.com/questions/44440278

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文