类成员地址与类指针值相同

时间:2018-03-07 18:29:09

标签: c++

我有一个班级Response,其公共成员属于另一个班级类型ResponseDataResponseData有一个string成员。

我注意到,在检查Response->responseDataResponse->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这是一个字符串......!

2 个答案:

答案 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大小),因此第一个成员具有与类

相同的地址