c++ - 将整数变量地址分配给类指针
问题描述
#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
但这是如何工作的?如何将整数类型转换为用户定义的类?请向我解释一下这个场景背后的概念。
解决方案
你在那里做的只是投射一个地址而不是一个整数。对于您的计算机,整数是一系列字节(在 32 位处理器中为 4 个字节),我们将其设为 8。这个整数有一个地址(在 32 位处理器中也是 4 个字节),假设该地址的值是 1。
在您的代码中,您正在转换 a 的地址。所以,指针 p2 有它的地址。根据定义,指针是地址。您的类“Child”将在强制转换中采用的参数是“a”之后的字节值,直到它填充其数据。在这种情况下,数据是单个 int,因此“a”的值和 Child“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;
}
推荐阅读
- javascript - Javascript 属性在 React 中用作默认状态时显示未定义
- oracle - DBMS_PARALLEL_EXECUTE.run_task 不启动并行作业
- javascript - 单击按钮时,生成一个带有自己计数器的新按钮
- python - 通过python数据框将XML文件转换为CSV
- localization - 在 SwiftUI 中使用字符串插值进行本地化
- sapui5 - 关闭对对话框片段不起作用 - 对话框在关闭时挂起
- java - Apache Jackrabbit (JCR) 我应该使用哪个 API 进行大规模删除
- python - 使用python在linux(ubuntu)机器上打开一个excel文件
- java - 如何在 Spring Boot 中的 JSONObject 内的 JSONArray 中放置 2 个或多个值?
- angular - 为什么注射在儿童班不起作用?