CopyingWithPointers.cpp
/** * 书本:【ThinkingInC++】 * 功能:类中指针 * 时间:2014年10月4日14:26:19 * 作者:cutter_point */ #include "../require.h" #include <iostream> #include <string> using namespace std; class Dog { string nm; public: Dog(const string& name) : nm(name) {cout<<"Creating Dog: "<<*this<<endl;} //这里有一个类似于拷贝构造函数的函数 Dog(const Dog* dp, const string& msg) : nm(dp->nm+msg) { cout<<"Copied dog "<<*this<<" from "<<*dp<<endl; } ~Dog() {cout<<"Deleting Dog: "<<*this<<endl;} void rename(const string& newName) { nm=newName; cout<<"Dog rename to: "<<*this<<endl; } friend ostream& operator << (ostream& os, const Dog& d) { return os<<"["<<d.nm<<"]"; } }; class DogHouse { Dog* p; string houseName; public: DogHouse(Dog* dog, const string house) : p(dog), houseName(house) {} //拷贝构造函数 Dog(const string& name) : nm(name) {cout<<"Creating Dog: "<<*this<<endl;} // Dog(const Dog* dp, const string& msg) : nm(dp->nm+msg) DogHouse(const DogHouse& dh) : p(new Dog(dh.p, "copy-construct")), houseName(dh.houseName+"copy-constructed") {} //为了避免自赋值,应该这样重载operator= DogHouse& operator=(const DogHouse& dh) { if(&dh != this) { p=new Dog(dh.p, "assigned"); houseName=dh.houseName+" assigned"; } return *this; } //改掉houseName的名字 void renameHouse(const string& newName) {houseName=newName; } //得到dog这个对象 Dog* getDog() const {return p;} //析构函数 ~DogHouse() {delete p;} friend ostream& operator << (ostream& os, const DogHouse& dh) { return os<<"["<<dh.houseName<<"] contains "<<*dh.p; } }; int main() { DogHouse fidos(new Dog("Fido"), "FidoHouse"); cout<<fidos<<endl; DogHouse fidos2=fidos; cout<<fidos2<<endl; fidos2.getDog()->rename("Spot"); fidos2.renameHouse("SpotHouse"); cout<<fidos2<<endl; fidos=fidos2; cout<<fidos<<endl; fidos.getDog()->rename("Max"); fidos2.renameHouse("MaxHouse"); return 0; }
原文地址:http://blog.csdn.net/cutter_point/article/details/39779545