//Heap Data Member //Demonstrates an object with a dynamically allocated data member #include <iostream> #include <string>
using namespace std;
class Animal { public: Animal(const string& name = "", int age = 0); ~Animal(); <SPAN style="WHITE-SPACE: pre"> </SPAN> <SPAN style="WHITE-SPACE: pre"> </SPAN>//destructor prototype Animal(const Animal& c); <SPAN style="WHITE-SPACE: pre"> </SPAN>//copy constructor prototype Animal& Animal::operator=(const Animal& c); <SPAN style="WHITE-SPACE: pre"> </SPAN>//assignment operator void Greet() const;
private: string* m_pName;<SPAN style="WHITE-SPACE: pre"> </SPAN>//★要注意的关键 int m_Age; };
Animal::Animal(const string& name, int age) { cout << "(构造函数被调用)\n"; m_pName = new string(name);<SPAN style="WHITE-SPACE: pre"> </SPAN>//另外分配内存空间 m_Age = age; }
Animal::~Animal() //手工定义析构函数的必要性 { cout << "(析构函数被调用)\n"; delete m_pName;<SPAN style="WHITE-SPACE: pre"> </SPAN>//释放内存空间 }
Animal::Animal(const Animal& c) <SPAN style="WHITE-SPACE: pre"> </SPAN>//手工定义拷贝构造函数的必要性 { cout << "(拷贝构造函数被调用)\n"; m_pName = new string(*(c.m_pName));<SPAN style="WHITE-SPACE: pre"> </SPAN>//实现“深拷贝”的关键 m_Age = c.m_Age; }
Animal& Animal::operator=(const Animal& c) //手工定义操作符重载的必要性 { cout << "(重载操作符被调用)\n"; if (this != &c) { delete m_pName;//别忘了释放掉原先的内存 m_pName = new string(*(c.m_pName)); m_Age = c.m_Age; } return *this; }
void Animal::Greet() const { cout << "你好,我叫" << *m_pName << " ,我今年" << m_Age << "岁了。 "; cout << "&m_pName: " << cout << &m_pName << endl; }
//声明3个测试函数 void testDestructor(); void testCopyConstructor(Animal aCopy); void testAssignmentOp();
int main() { testDestructor(); cout << endl; Animal crit("Poochie", 5); crit.Greet(); testCopyConstructor(crit); crit.Greet(); cout << endl; testAssignmentOp();
return 0; }
void testDestructor() { Animal toDestroy("Rover", 3); toDestroy.Greet(); }<SPAN style="WHITE-SPACE: pre"> </SPAN>//运行结束时,toDestroy对象随即被销毁
void testCopyConstructor(Animal aCopy) //注:不是引用类型 { aCopy.Greet(); }
void testAssignmentOp() { Animal ani1("ani1", 7); Animal ani2("ani2", 9); ani1 = ani2; ani1.Greet(); ani2.Greet(); cout << endl; Animal ani3("ani", 11); ani3 = ani3; ani3.Greet(); }
|