#include<iostream>
using namespace std;
class Child {
public:
int b;
void gotoSchool() {
cout << "going to school";
}
};
int main( )
{
int a;
Child *p2 = (Child *) &a; // #2
p2->gotoSchool();
return 0;
}
此代码的输出是
going to school
但是这如何工作?如何将整数类型转换为用户定义的类?请向我解释这种情况背后的概念。
答案 0 :(得分:0)
您在这里所做的只是仅投射地址,而不是整数。对于您的计算机,整数是一个字节序列(在32位处理器中为4字节),我们将其设置为8。该整数具有地址(在32bit处理器中也为4字节),说那个地址的值为1。
在您的代码中您要投射的地址。因此,指针p2具有其地址。根据定义,指针是地址。您的“ Child”类将在转换中采用的参数是“ a”之后的字节值,直到填充其数据为止。 在这种情况下,数据是单个整数,因此“ a”的值和子级“ b”的值将是相同的。指针,因为它只是一个内存地址可以是任何类型(将类视为您想要的类型)。 该类型仅告诉指针数据的大小是多少,以及如何解释该数据。现在,您很不幸,该类型非常适合整数。但是通常情况下,这种转换的行为是无法预料的。 我已经修改了您的代码以阐明正在发生的事情,我认为您在执行代码后会更加清楚
#include<iostream>
using namespace std;
class Child {
public:
float b;
Child(){ b = -0.5;};
void gotoSchool(){
cout<<"going to school" << endl;}
void changeValue(){ b = -0.5;};
void displayB()
{
cout << "the value of b is " << b << endl;
};
};
class OriginalChild {
public:
int b;
void gotoSchool(){
cout<<"going to school";}
};
int main( )
{
int a = 8;
Child *p2 = (Child *) &a; // #2
OriginalChild *p3 = (OriginalChild *) &a;
p2->gotoSchool();
cout << a << endl;
p2->displayB();
cout << p3->b << endl;
p2->changeValue();
cout << a << endl;
return 0;
}