为什么要进行此转换?

时间:2017-06-08 15:48:48

标签: c++

为什么你能这样做:

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都没有转换构造函数,那么这个操作如何工作呢?它有多少运算符,是运算符本身的括号,如=是运算符。

3 个答案:

答案 0 :(得分:2)

这些类型的演员阵容是C style casts,并且可以让你将任何东西投射到任何其他东西上。强制转换是对编译器的声明,忽略它的类型安全规则并相信您最了解。当类型系统无法获得获得正确结论所需的所有信息时,有时这是必要的。但是,如果你对编译器说某些类型的东西,那么你就会产生未定义的行为。

在c ++中,你应该避免预先形成C样式转换,并且更喜欢更安全的c ++替代品(列出here。这些演员阵容不能完全保护你自己,但它们确实允许你传达类型你想要预成型的演员。使用这些额外的信息,编译器可以警告你,你的演员阵容是否会做你预期的其他事情。

答案 1 :(得分:1)

使用时:

padd = (Addition*) &d;

编译器假定您(负责人)知道您在做什么。如果你用自己选择的脚射击自己。编译器很乐意让你这样做。

如果您希望编译器阻止您出现这种意外的,自己拍摄的情况,请使用static_cast

padd = static_cast<Addition*>(&d);

编译器会告诉您这不行。

答案 2 :(得分:0)

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

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