我正在學習C++,我有一個問題,關於我正在使用的材料。我認爲編輯可能存在一些錯誤,但我不確定。我的書名叫「C++通過遊戲編程」。存儲在堆內存中的成員數據的地址
下面是書中的代碼,它在第9章
class Critter {
public:
Critter(const string &name = "", int age = 0);
~Critter();
Critter(const Critter &c);
Critter& operator=(const Critter& c);
void greet() const;
private:
string *mName;
int mAge;
};
Critter::Critter(const string &name, int age) {
cout << "Constructor called\n";
mName = new string(name);
mAge = age;
}
Critter::~Critter() {
cout << "Destructor called\n";
delete mName;
}
Critter::Critter(const Critter &c) {
cout << "Copy constructor called\n";
mName = new string(*(c.mName));
mAge = c.mAge;
}
Critter& Critter::operator=(const Critter& c) {
cout << "Overloading assignment operator called\n";
if (this != &c) {
delete mName;
mName = new string(*(c.mName));
mAge = c.mAge;
}
return *this;
}
void Critter::greet() const {
cout << "I'm " << *mName << " and I'm " << mAge << " years old.\n";
cout << "&mName: " << &mName << endl;
}
這裏我創建一個小動物類,並測試分配堆內存。正如你所看到的,我聲明瞭一個指向堆內存上的字符串對象的指針* mName。
那麼,什麼是困惑我現在是,在最後的方法: 無效小動物::迎接()const的 他們說,「存儲在指針m_pName堆字符串的地址」是& MNAME,因爲它們在方法中打印出來。
但我認爲mName本身就是存儲在堆上的字符串對象的地址。所以& mName是指針本身的地址。
要說清楚,我也嘗試打印& mAge。
而我得到的是:
&mName: 0x7fff5fbff640
mName: 0x100103b20
&mAge: 0x7fff5fbff648
正如你所看到的,& MNAME和&法師有近類似的地址,但MNAME的是不同的。因此,也許mName指向堆,而mName和& mAge實際上是屬於堆棧的地址。
這就是我想的,我試圖找到那本書的勘誤表,但是我什麼都沒發現。你們能爲我說清楚嗎?我是對還是可能有一些誤解?
感謝您的幫助。對此,我真的非常感激。