#include <algorithm>
#include <cstring>
#include <iostream>
class A
{
public:
// construct from string
A () : str(new char[1]()) {}
A(const char *s) : str(new char[strlen(s) + 1])
{ strcpy(str, s); }
// copy construct
A(const A& rhs) : str(new char[strlen(rhs.str) + 1])
{ strcpy(str, rhs.str); }
// destruct
~A() { delete [] str; }
// assign
A& operator=(const A& rhs)
{
A temp(rhs);
std::swap(str, temp.str);
return *this;
}
// implement
void setStr(char * s)
{
A temp(s);
*this = temp;
}
const char* getStr() { return str; }
private:
char * str;
};
using namespace std;
int main()
{
A a1;
a1.setStr("abc");
A a2;
a2 = a1;
A a3 = a1;
a2.setStr("456");
cout << a1.getStr() << "\n" << a2.getStr() << "\n" << a3.getStr();
}
I2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPGNzdHJpbmc+CiNpbmNsdWRlIDxpb3N0cmVhbT4KCmNsYXNzIEEKewogICAgcHVibGljOgogICAgICAgLy8gY29uc3RydWN0IGZyb20gc3RyaW5nCiAgICAgICBBICgpIDogc3RyKG5ldyBjaGFyWzFdKCkpIHt9CgogICAgICAgQShjb25zdCBjaGFyICpzKSA6IHN0cihuZXcgY2hhcltzdHJsZW4ocykgKyAxXSkKICAgICAgIHsgc3RyY3B5KHN0ciwgcyk7IH0KICAgICAgIAogICAgICAgLy8gY29weSBjb25zdHJ1Y3QKICAgICAgIEEoY29uc3QgQSYgcmhzKSA6IHN0cihuZXcgY2hhcltzdHJsZW4ocmhzLnN0cikgKyAxXSkKICAgICAgIHsgc3RyY3B5KHN0ciwgcmhzLnN0cik7IH0KCiAgICAgICAvLyBkZXN0cnVjdAogICAgICAgfkEoKSB7IGRlbGV0ZSBbXSAgc3RyOyB9CgogICAgICAgLy8gYXNzaWduCiAgICAgICBBJiBvcGVyYXRvcj0oY29uc3QgQSYgcmhzKQogICAgICAgewogICAgICAgICAgQSB0ZW1wKHJocyk7CiAgICAgICAgICBzdGQ6OnN3YXAoc3RyLCB0ZW1wLnN0cik7CiAgICAgICAgICByZXR1cm4gKnRoaXM7CiAgICAgICB9CgogICAgICAgLy8gaW1wbGVtZW50CiAgICAgICB2b2lkIHNldFN0cihjaGFyICogcykKICAgICAgIHsKICAgICAgICAgIEEgdGVtcChzKTsKICAgICAgICAgICp0aGlzID0gdGVtcDsKICAgICAgIH0gIAoKICAgICAgIGNvbnN0IGNoYXIqIGdldFN0cigpIHsgcmV0dXJuIHN0cjsgfQogICAgICAgCiAgICAgcHJpdmF0ZToKICAgICAgICBjaGFyICogc3RyOwp9OwoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmludCBtYWluKCkKewoJQSBhMTsKCWExLnNldFN0cigiYWJjIik7CglBIGEyOwoJYTIgPSBhMTsKCUEgYTMgPSBhMTsKCWEyLnNldFN0cigiNDU2Iik7Cgljb3V0IDw8IGExLmdldFN0cigpIDw8ICJcbiIgPDwgYTIuZ2V0U3RyKCkgPDwgIlxuIiA8PCBhMy5nZXRTdHIoKTsKfQoJCg==