C++ 堆成员和其中一个成员的引用之间有什么区别?

C++ 堆成员和其中一个成员的引用之间有什么区别?,c++,pointers,constructor,reference,heap,C++,Pointers,Constructor,Reference,Heap,我从一本书中得到了这个复制构造函数,并添加了cout来比较值: Person::Person(const Person& c) { m_pName = new string(*(c.m_pName)); m_Age = c.m_Age; cout << m_pName << " " << &m_pName; } 从您提供的代码片段来看,m_pName是指向string(可能指向std::string)的指针,因此m_

我从一本书中得到了这个复制构造函数,并添加了cout来比较值:

Person::Person(const Person& c) {
    m_pName = new string(*(c.m_pName));
    m_Age = c.m_Age;

    cout << m_pName << " " << &m_pName;
}

从您提供的代码片段来看,
m_pName
是指向
string
(可能指向
std::string
)的指针,因此
m_pName
不带符号,是该字符串的地址,刚刚分配。

这两个地址是指针指向的地址和指针变量本身。它只表示&m_pName是堆成员地址,这取决于Person是否在堆上。m_pName是指向字符串的指针。我想你可以通过这行来判断:new string(*(c.m_pName))在哪里被取消引用,但是我用一个类和构造函数更新了这个问题,以使问题更清楚。那么&m_pName是指针的地址,m_pName是新字符串的地址?是的,这是正确的。
class Person() {
public:
    Person(const string& name = 0);
    Person(const Person& c);
private:
    string* m_pName;
}

Person::Person(const string& name) {
    m_pName = new string(name);
}