Sashkinzz Asked:2023-04-05 15:42:59 +0000 UTC2023-04-05 15:42:59 +0000 UTC 2023-04-05 15:42:59 +0000 UTC 引用和指针的类型转换 772 int y=0; double z=1.9; y=z; int* py; double* pz; //py=pz; error //int& rp=z; error 问题:为什么可以将一种类型的变量赋给另一种类型的变量,但不能使用指针和引用? c++ 2 个回答 Voted Best Answer Harry 2023-04-05T15:52:05Z2023-04-05T15:52:05Z 因为在分配变量时,值被复制并转换为所需的类型(例如,1.9 被转换为 1),而在使用指针时,您只需复制地址,结果是什么位于,例如,在内存中的地址double*准确地表示double,而您正试图说“没有double,那里int”。他们的心态完全不同。相同位置的位具有不同的含义。而且,大小可能不匹配,并且在分配(在地址处写入值)时,您可以轻松覆盖其他人的内存。 总之,这是一个太危险的操作,不能就这样暗中允许它。明确地 - 你可以告诉编译器“我知道我做得更好!”,比如 int * py = (int*)pz; 到底会发生什么?请参阅此类转换的示例https://ideone.com/mClrR1 AlexGlebe 2023-04-05T16:15:26Z2023-04-05T16:15:26Z 为了清楚起见,不考虑内置类型,而是考虑类。类 class A{}; class B{}; 不相容。并且不通过值、指针和引用提供相互赋值。 相关类已经可以交互 class A{}; class B:public A{}; B b ; B * bp = & b ; B & bl = b ; A a = b ; A & al = bl ; A * ap = bp ; 由于在内存中一个B类型的对象包含了一个A类型对象的一部分。而编译器只能考虑相关的部分。 您不能将类型int和不相关的类型以及它们的指针分配给彼此。double值可以,因为存在从一种类型到另一种类型的强制转换。在类中它看起来像这样: class A{}; class B{ public: B(A const&){} };
因为在分配变量时,值被复制并转换为所需的类型(例如,1.9 被转换为 1),而在使用指针时,您只需复制地址,结果是什么位于,例如,在内存中的地址
double*准确地表示double,而您正试图说“没有double,那里int”。他们的心态完全不同。相同位置的位具有不同的含义。而且,大小可能不匹配,并且在分配(在地址处写入值)时,您可以轻松覆盖其他人的内存。总之,这是一个太危险的操作,不能就这样暗中允许它。明确地 - 你可以告诉编译器“我知道我做得更好!”,比如
到底会发生什么?请参阅此类转换的示例https://ideone.com/mClrR1
为了清楚起见,不考虑内置类型,而是考虑类。类
不相容。并且不通过值、指针和引用提供相互赋值。
相关类已经可以交互
由于在内存中一个B类型的对象包含了一个A类型对象的一部分。而编译器只能考虑相关的部分。
您不能将类型
int和不相关的类型以及它们的指针分配给彼此。double值可以,因为存在从一种类型到另一种类型的强制转换。在类中它看起来像这样: