【问题标题】:Get the address of class's object in C++?在 C++ 中获取类对象的地址?
【发布时间】:2011-05-16 00:16:28
【问题描述】:

假设我有一个 C++ 类如下:

class Point {
// implementing some operations
}

然后:

Point p1;
Point p2 = p1;

如果我想知道p2的地址,可以使用&p2。但是我怎样才能得到 p2 存储的地址呢?因为 p2 不是指针,所以不能只用cout << p2;

【问题讨论】:

  • 嗯? p2 不存储地址,因为它不是指针。它存储用户定义的数据(它的成员变量)。

标签: c++ memory-address


【解决方案1】:

以下有什么问题:

cout << &p2;

正如你所说,p2 不是指针。从概念上讲,它是存储在内存某处的数据块。 &amp;p2 是这个块的地址。当你这样做时:

Point p2 = p1;

...该数据被复制到块'标记'p1。

但是我怎样才能得到 p2 存储的地址呢?

除非您将指针成员添加到Point 数据结构,否则它不会存储地址。正如你所说,它不是指针。

附: hex 流操作符也可能有用:

cout << hex << &p2 << endl;

【讨论】:

【解决方案2】:

通过做

Point p2 = p1;

您只需将 p2 的值复制到 p1 上(很可能)。内存是独立的。 如果你这样做了:

Point* p2 = &p1;

那么 p2 将是指向 p1 的指针(打印它的值将为您提供内存块的开头,然后您可以尝试 sizeof 来获取块的大小)。

【讨论】:

  • 嗨,Hauron。 “将 p2 的值复制到 p1 上”应该是相反的。指针的好例子,但应该是sizeof(没有下划线),无论如何,您可以使用sizeof(Point) 或sizeof p1 以及sizeof *p2 获取对象的大小作为您的指针版本。干杯。
【解决方案3】:

接受的答案建议使用运算符&amp; 来获取对象的地址。

从 C++11 开始,如果对象类定义/重载运算符 &amp;,则此解决方案不起作用。

为了获取对象的地址,从 C++11 开始,应该使用模板函数std::addressof()。

Point p1;
Point* p2 = std::addressof(p1);

http://www.cplusplus.com/reference/memory/addressof/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-19
    相关资源
    最近更新 更多