#include #include using namespace std; class Thing { char* name; public: Thing(const char* arg = nullptr); Thing(const Thing& t); // copy ctor ~Thing(); const char* get_name() const { return name; } }; Thing::Thing(const char* arg) : name(new char[strlen(arg)+1]) { if (strcmp(arg,"Satan")==0) throw (this); else strcpy(name,arg); cout << ">>> " << name << " successfully constructed\n"; } Thing::Thing(const Thing& arg) : name(new char[strlen(arg.name)+6]) { strcpy(name,arg.name); strcat(name, " Clone"); cout << ">>> " << name << " successfully copy constructed\n"; } Thing::~Thing() { cout << "<<< destructor called for Thing " << name << endl; if (name) delete [] name; name = nullptr; } int main() { Thing* pThing; try { Thing aFriend("Sam"); Thing aFriendClone(aFriend); cout << endl; pThing = new Thing("Sarah"); delete pThing; cout << endl; Thing satan("Satan"); Thing harry("Harry"); } catch(const Thing* ptr) { cerr << "I caught an evil Thing" << endl; delete [] ptr->get_name(); } delete pThing; cerr << "*** End of Program ***\n"; }