我有一个班级Response
,其公共成员属于另一个班级类型ResponseData
。 ResponseData
有一个string
成员。
我注意到,在检查Response->responseData
和Response->responseData->data
时,ResponseData*
的值和ResponseData->data
的地址是相同的。
以某种方式指向类的指针的值与该类的字符串成员的地址相同。
https://onlinegdb.com/Bk-kJ3a_z
#include <iostream>
#include <string>
#include <vector>
// ResponseData
class ResponseData {
public:
std::string data;
ResponseData();
~ResponseData();
void PrintToConsole();
};
ResponseData:: ResponseData(){
data = "some data";
}
ResponseData::~ResponseData(){}
void ResponseData::PrintToConsole(){
std::cout << this->data << std::endl;
}
// Response
class Response {
public:
ResponseData *responseData;
Response();
~Response();
void SetResponseData(std::string data);
ResponseData* GetResponseData();
};
Response::Response():responseData(NULL){}
Response::~Response(){}
void Response::SetResponseData(std::string data){
this->responseData = new ResponseData();
this->responseData->data = data;
}
ResponseData* Response::GetResponseData(){
return this->responseData;
}
int main(){
Response response;
response.SetResponseData("hello");
ResponseData* responseData = response.GetResponseData();
// value of ResponseData* and address of ResponseData->data are the same..?
std::cout << responseData << std::endl;
std::cout << &responseData->data << std::endl;
responseData->PrintToConsole();
return 0;
}
我甚至不知道这是否是一个问题,因为我的代码运行正常。但这对我没有意义。也许我还是不明白指针。调用PrintToConsole
不应该有效,因为显然responseData
指的是responseData->data
这是一个字符串......!
答案 0 :(得分:1)
指针返回的地址理想地表示该对象的起始地址。当您打印该类的第一个数据元素的地址时,它的地址将与False
对象的地址相同。 (只要它不是虚拟类)
responseData
您可以在此验证,#include <iostream>
#include <string>
#include <vector>
// ResponseData
class ResponseData {
public:
std::string data;
//a dummy data just to demonstrate
int dummyData;
ResponseData();
~ResponseData();
void PrintToConsole();
};
ResponseData:: ResponseData(){
data = "some data";
}
ResponseData::~ResponseData(){}
void ResponseData::PrintToConsole(){
std::cout << this->data << std::endl;
}
// Response
class Response {
public:
ResponseData *responseData;
Response();
~Response();
void SetResponseData(std::string data);
ResponseData* GetResponseData();
};
Response::Response():responseData(NULL){}
Response::~Response(){}
void Response::SetResponseData(std::string data){
this->responseData = new ResponseData();
this->responseData->data = data;
}
ResponseData* Response::GetResponseData(){
return this->responseData;
}
int main(){
Response response;
response.SetResponseData("hello");
ResponseData* responseData = response.GetResponseData();
// value of ResponseData* and address of ResponseData->data are the same..?
std::cout << responseData << std::endl;
std::cout << &(responseData->dummyData) << std::endl;
responseData->PrintToConsole();
return 0;
}
的地址与dummyData
对象的地址不同。
答案 1 :(得分:-1)
非虚拟类的大小与用于存储其成员的空间的总和相同,类本身不占用空间(除非它是一个非零大小的空类,除非空类是基类class,在这种情况下,类再次允许具有0大小),因此第一个成员具有与类
相同的地址