2014-06-21 107 views
2

我正在學習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實際上是屬於堆棧的地址。

這就是我想的,我試圖找到那本書的勘誤表,但是我什麼都沒發現。你們能爲我說清楚嗎?我是對還是可能有一些誤解?

感謝您的幫助。對此,我真的非常感激。

回答

0

你確實沒錯。由於mName是一個指針,因此該指針的值是它指向的字符串對象的地址。 &mName是存儲指針本身的地址。