#include<iostream>
#include<vector>
using namespace std;
class A
{
int *ptr;
public:
A(int a)
{
ptr = new int(a);
std::cout<<"Constructor : "<<*ptr<<endl;
}
A(const A& a)
{
std::cout<<"Copy Constructor : "<<*(a.ptr)<<endl;
ptr = new int(*(a.ptr));
*ptr = *a.ptr;
}
A& operator=(const A& a)
{
std::cout<<"Copy Assignment "<<*a.ptr<<endl;
if(this != &a)
{
delete ptr;
ptr = new int(*a.ptr);
}
return *this;
}
A(A&& a):ptr(a.ptr)
{
std::cout<<"Move Constructor : "<<*a.ptr<<endl;
a.ptr = nullptr;
}
A& operator=(A && a)
{
std::cout<<"Move Assignment : "<<*a.ptr<<endl;
if(&a != this)
{
ptr = a.ptr;
a.ptr = nullptr;
}
return *this;
}
~A()
{
std::cout<<"Destructor : ";
if(ptr)
{
std::cout<<*ptr<<endl;
delete ptr;
}
}
};
int main()
{
vector<A> vec;
vec.push_back(A(1));
A a1(2);
vec.push_back(a1);
A a2(3);
vec.push_back(std::move(a2));
a2 = a1;
a1 = A(4);
}
I2luY2x1ZGU8aW9zdHJlYW0+CiNpbmNsdWRlPHZlY3Rvcj4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmNsYXNzIEEKewppbnQgKnB0cjsKcHVibGljOgoJQShpbnQgYSkKCXsgCQoJCXB0ciA9IG5ldyBpbnQoYSk7CgkJc3RkOjpjb3V0PDwiQ29uc3RydWN0b3IgOiAiPDwqcHRyPDxlbmRsOwoJfQoJQShjb25zdCBBJiBhKQoJewoJCXN0ZDo6Y291dDw8IkNvcHkgQ29uc3RydWN0b3IgOiAiPDwqKGEucHRyKTw8ZW5kbDsKCQlwdHIgPSBuZXcgaW50KCooYS5wdHIpKTsKCQkqcHRyID0gKmEucHRyOwoJfQoJQSYgb3BlcmF0b3I9KGNvbnN0IEEmIGEpCgl7CgkJc3RkOjpjb3V0PDwiQ29weSBBc3NpZ25tZW50ICI8PCphLnB0cjw8ZW5kbDsKCQlpZih0aGlzICE9ICZhKQoJCXsKCQkJZGVsZXRlIHB0cjsKCQkJcHRyID0gbmV3IGludCgqYS5wdHIpOwoJCX0KCQkKCQlyZXR1cm4gKnRoaXM7Cgl9CglBKEEmJiBhKTpwdHIoYS5wdHIpCgl7CgkJc3RkOjpjb3V0PDwiTW92ZSBDb25zdHJ1Y3RvciA6ICI8PCphLnB0cjw8ZW5kbDsKCQlhLnB0ciA9IG51bGxwdHI7Cgl9CglBJiBvcGVyYXRvcj0oQSAmJiBhKQoJewoJCXN0ZDo6Y291dDw8Ik1vdmUgQXNzaWdubWVudCA6ICI8PCphLnB0cjw8ZW5kbDsKCQlpZigmYSAhPSB0aGlzKQoJCXsKCQkJcHRyID0gYS5wdHI7CgkJCWEucHRyID0gbnVsbHB0cjsKCQl9CgkJcmV0dXJuICp0aGlzOwoJfQoJfkEoKQoJewoJCXN0ZDo6Y291dDw8IkRlc3RydWN0b3IgOiAiOwoJCWlmKHB0cikKCQl7CgkJCXN0ZDo6Y291dDw8KnB0cjw8ZW5kbDsKCQkJZGVsZXRlIHB0cjsKCQl9Cgl9Cn07CgppbnQgbWFpbigpCnsKCXZlY3RvcjxBPiB2ZWM7Cgl2ZWMucHVzaF9iYWNrKEEoMSkpOwoJQSBhMSgyKTsKCXZlYy5wdXNoX2JhY2soYTEpOwoJQSBhMigzKTsKCXZlYy5wdXNoX2JhY2soc3RkOjptb3ZlKGEyKSk7CglhMiA9IGExOwoJYTEgPSBBKDQpOwp9