我正在学习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;
}
这里我正在创建一个Critter类,并测试分配堆内存。如您所见,我声明了一个指针* mName指向堆内存上的字符串对象。
所以令我困惑的是,在最后一种方法中: void Critter :: greet()const 他们说“存储在指针m_pName中的堆上的字符串的地址”是&amp; mName,因为它们在方法中打印出来。
但我认为mName本身就是存储在堆上的字符串对象的地址。所以&amp; mName是指针本身的地址。
为了说清楚,我也尝试打印&amp; mAge。
我得到的是:
&mName: 0x7fff5fbff640
mName: 0x100103b20
&mAge: 0x7fff5fbff648
正如您所看到的,&amp; mName和&amp; mAge具有几乎相似的地址,但mName是不同的。所以mName可能指向堆,而&amp; mName和&amp; mAge实际上是属于堆栈的地址。
这就是我的想法,我试图找到那本书的勘误,但我一无所获。你们能帮我说清楚吗?我是对的还是我可能有一些误解。
感谢您的帮助。我真的很感激。
答案 0 :(得分:0)
你做对了。因为mName
是一个指针,所以该指针的值是它指向的字符串对象的地址。 &mName
是指针本身的存储地址。