为什么你能这样做:
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
都没有转换构造函数,那么这个操作是如何工作的呢?它有多少个操作符,它是否是操作符本身的括号,就像=
是一个运算符。
发布于 2017-06-08 07:54:48
发布于 2017-06-08 07:53:32
当你使用:
padd = (Addition*) &d;
编译器假设你,负责的人,知道你在做什么。如果你朝自己的脚开枪,那是你自己选择的。编译器很乐意让您这样做。
如果您想让编译器防止您遇到这样的意外情况,请使用static_cast
。
padd = static_cast<Addition*>(&d);
编译器会让您知道这是不对的。
发布于 2017-06-08 07:54:26
如果使用C样式强制转换,则不检查指针之间的错误或兼容性。另外,我认为您误解了一元运算符&
的目的,在这种情况下,它给出了d
的地址,并且与引用无关。
内存中的对象只是程序知道的某种类型的位,如果您告诉它它是另一种类型,它将不会影响变量中的任何内容。
https://stackoverflow.com/questions/44440278
复制相似问题