#include <iostream>
using namespace std;
class Object
{
public:
Object() { cout << "in constructor Object()" << endl; }
};
class OtherObject
{
public:
operator Object*() { return new Object(); }
};
class scoped_ptr
{
Object *pObj;
public:
scoped_ptr(Object *pObject) : pObj(pObject)
{
cout << "in constructor scoped_ptr(Object*)" << endl;
}
scoped_ptr(const scoped_ptr& ptr)
{
cout << "in constructor scoped_ptr(const scoped_ptr&)" << endl;
pObj = ptr.pObj;
}
scoped_ptr& operator=(const scoped_ptr& ptr)
{
cout << "in scoped_ptr::operator=(const scoped_ptr&)" << endl;
pObj = ptr.pObj;
return *this;
}
};
int main()
{
scoped_ptr p = new Object();
p = new Object();
scoped_ptr p1(OtherObject());
scoped_ptr p2 = OtherObject();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY2xhc3MgT2JqZWN0CnsKcHVibGljOgogICAgT2JqZWN0KCkgeyBjb3V0IDw8ICJpbiBjb25zdHJ1Y3RvciBPYmplY3QoKSIgPDwgZW5kbDsgfQp9OwoKY2xhc3MgT3RoZXJPYmplY3QKewpwdWJsaWM6CiAgICBvcGVyYXRvciBPYmplY3QqKCkgeyByZXR1cm4gbmV3IE9iamVjdCgpOyB9Cn07CgpjbGFzcyBzY29wZWRfcHRyCnsKICAgIE9iamVjdCAqcE9iajsKCnB1YmxpYzoKICAgIHNjb3BlZF9wdHIoT2JqZWN0ICpwT2JqZWN0KSA6IHBPYmoocE9iamVjdCkKICAgIHsKICAgICAgICBjb3V0IDw8ICJpbiBjb25zdHJ1Y3RvciBzY29wZWRfcHRyKE9iamVjdCopIiA8PCBlbmRsOwogICAgfQoKICAgIHNjb3BlZF9wdHIoY29uc3Qgc2NvcGVkX3B0ciYgcHRyKQogICAgewogICAgICAgIGNvdXQgPDwgImluIGNvbnN0cnVjdG9yIHNjb3BlZF9wdHIoY29uc3Qgc2NvcGVkX3B0ciYpIiA8PCBlbmRsOwogICAgICAgIHBPYmogPSBwdHIucE9iajsKICAgIH0KCiAgICBzY29wZWRfcHRyJiBvcGVyYXRvcj0oY29uc3Qgc2NvcGVkX3B0ciYgcHRyKQogICAgewogICAgICAgIGNvdXQgPDwgImluIHNjb3BlZF9wdHI6Om9wZXJhdG9yPShjb25zdCBzY29wZWRfcHRyJikiIDw8IGVuZGw7CiAgICAgICAgcE9iaiA9IHB0ci5wT2JqOwogICAgICAgIHJldHVybiAqdGhpczsKICAgIH0KfTsKCmludCBtYWluKCkKewogICAgc2NvcGVkX3B0ciBwID0gbmV3IE9iamVjdCgpOwogICAgcCA9IG5ldyBPYmplY3QoKTsKICAgIHNjb3BlZF9wdHIgcDEoT3RoZXJPYmplY3QoKSk7CiAgICBzY29wZWRfcHRyIHAyID0gT3RoZXJPYmplY3QoKTsKICAgIHJldHVybiAwOwp9