为什么你能这样做:
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的报价:
不受限制的显式类型转换允许将任何指针转换为 任何其他指针类型,与它们指向的类型无关。
但是,为什么你可以将任何指针转换为任何其他指针类型,只要你在引用之前使用转换运算符?
谈到该转换操作符,如何将所有类型转换为另一种类型?它是否会调用转换构造函数,因为如果是这样,我就不会得到它,因为Dummy
和Addition
都没有转换构造函数,那么这个操作如何工作呢?它有多少运算符,是运算符本身的括号,如=
是运算符。
答案 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
的地址,与引用无关。
内存中的对象只是程序知道属于某种类型的位,如果你告诉它它是另一种类型,它不会影响变量中的任何内容。