#include <iostream>
using std::cout;
using std::endl;
class Foo {
int m_i;
public:
Foo() : m_i(0) { cout << "Foo(@" << (void*)this << ") ctor" << endl; }
Foo(int i) : m_i(i) { cout << "Foo(" << i << "@" << (void*)this << ") ctor" << endl; }
~Foo() { cout << "Foo(" << m_i << "@" << (void*)this << ") dtor" << endl;}
Foo(const Foo& rhs) : m_i(rhs.m_i) { cout << "Copying(" << m_i << "@" << (void*)&rhs << ") to Foo(@" << (void*)this << ")" << endl; }
Foo& operator = (Foo rhs) { m_i = rhs.m_i; cout << "op=ing(" << m_i << "@" << (void*)&rhs << ") to Foo(@" << (void*)this << ")" << endl; }
Foo operator + (Foo rhs) {
Foo result(m_i);
cout << (void*)(&result) << " = " << (void*)this << " + " << (void*)(&rhs) << endl;
result.m_i += rhs.m_i;
return result;
}
operator int() const { return m_i; }
};
class Bar {
int m_i;
public:
Bar() : m_i(0) { cout << "Bar(@" << (void*)this << ") ctor" << endl; }
Bar(int i) : m_i(i) { cout << "Bar(" << i << "@" << (void*)this << ") ctor" << endl; }
~Bar() { cout << "Bar(" << m_i << "@" << (void*)this << ") dtor" << endl;}
Bar(const Bar& rhs) : m_i(rhs.m_i) { cout << "Copying(" << m_i << "@" << (void*)&rhs << ") to Bar(@" << (void*)this << ")" << endl; }
Bar& operator = (const Bar& rhs) { m_i = rhs.m_i; cout << "op=ing(" << m_i << "@" << (void*)&rhs << ") to Bar(@" << (void*)this << ")" << endl; }
Bar operator + (const Bar& rhs) {
Bar result(m_i);
cout << (void*)(&result) << " = " << (void*)this << " + " << (void*)(&rhs) << endl;
result.m_i += rhs.m_i;
return result;
}
operator int() const { return m_i; }
};
int main(int argc, const char** argv) {
{
Foo a(5), b(10), c;
c = a + b;
cout << (int)c << endl;
}
cout << endl << "Now let's do it properly." << endl << endl;
{
Bar a(5), b(10), c;
c = a + b;
cout << (int)c << endl;
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdXNpbmcgc3RkOjpjb3V0Owp1c2luZyBzdGQ6OmVuZGw7CgpjbGFzcyBGb28gewogICAgaW50IG1faTsKcHVibGljOgogICAgRm9vKCkgOiBtX2koMCkgeyBjb3V0IDw8ICJGb28oQCIgPDwgKHZvaWQqKXRoaXMgPDwgIikgY3RvciIgPDwgZW5kbDsgfQogICAgRm9vKGludCBpKSA6IG1faShpKSB7IGNvdXQgPDwgIkZvbygiIDw8IGkgPDwgIkAiIDw8ICh2b2lkKil0aGlzIDw8ICIpIGN0b3IiIDw8IGVuZGw7IH0KICAgIH5Gb28oKSB7IGNvdXQgPDwgIkZvbygiIDw8IG1faSA8PCAiQCIgPDwgKHZvaWQqKXRoaXMgPDwgIikgZHRvciIgPDwgZW5kbDt9CgogICAgRm9vKGNvbnN0IEZvbyYgcmhzKSA6IG1faShyaHMubV9pKSB7IGNvdXQgPDwgIkNvcHlpbmcoIiA8PCBtX2kgPDwgIkAiIDw8ICh2b2lkKikmcmhzIDw8ICIpIHRvIEZvbyhAIiA8PCAodm9pZCopdGhpcyA8PCAiKSIgPDwgZW5kbDsgfQogICAgRm9vJiBvcGVyYXRvciA9IChGb28gcmhzKSB7IG1faSA9IHJocy5tX2k7IGNvdXQgPDwgIm9wPWluZygiIDw8IG1faSA8PCAiQCIgPDwgKHZvaWQqKSZyaHMgPDwgIikgdG8gRm9vKEAiIDw8ICh2b2lkKil0aGlzIDw8ICIpIiA8PCBlbmRsOyB9CgogICAgRm9vIG9wZXJhdG9yICsgKEZvbyByaHMpIHsKICAgICAgICBGb28gcmVzdWx0KG1faSk7CiAgICAgICAgY291dCA8PCAodm9pZCopKCZyZXN1bHQpIDw8ICIgPSAiIDw8ICh2b2lkKil0aGlzIDw8ICIgKyAiIDw8ICh2b2lkKikoJnJocykgPDwgZW5kbDsKICAgICAgICByZXN1bHQubV9pICs9IHJocy5tX2k7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgb3BlcmF0b3IgaW50KCkgY29uc3QgeyByZXR1cm4gbV9pOyB9Cn07CgpjbGFzcyBCYXIgewogICAgaW50IG1faTsKcHVibGljOgogICAgQmFyKCkgOiBtX2koMCkgeyBjb3V0IDw8ICJCYXIoQCIgPDwgKHZvaWQqKXRoaXMgPDwgIikgY3RvciIgPDwgZW5kbDsgfQogICAgQmFyKGludCBpKSA6IG1faShpKSB7IGNvdXQgPDwgIkJhcigiIDw8IGkgPDwgIkAiIDw8ICh2b2lkKil0aGlzIDw8ICIpIGN0b3IiIDw8IGVuZGw7IH0KICAgIH5CYXIoKSB7IGNvdXQgPDwgIkJhcigiIDw8IG1faSA8PCAiQCIgPDwgKHZvaWQqKXRoaXMgPDwgIikgZHRvciIgPDwgZW5kbDt9CgogICAgQmFyKGNvbnN0IEJhciYgcmhzKSA6IG1faShyaHMubV9pKSB7IGNvdXQgPDwgIkNvcHlpbmcoIiA8PCBtX2kgPDwgIkAiIDw8ICh2b2lkKikmcmhzIDw8ICIpIHRvIEJhcihAIiA8PCAodm9pZCopdGhpcyA8PCAiKSIgPDwgZW5kbDsgfQogICAgQmFyJiBvcGVyYXRvciA9IChjb25zdCBCYXImIHJocykgeyBtX2kgPSByaHMubV9pOyBjb3V0IDw8ICJvcD1pbmcoIiA8PCBtX2kgPDwgIkAiIDw8ICh2b2lkKikmcmhzIDw8ICIpIHRvIEJhcihAIiA8PCAodm9pZCopdGhpcyA8PCAiKSIgPDwgZW5kbDsgfQoKICAgIEJhciBvcGVyYXRvciArIChjb25zdCBCYXImIHJocykgewogICAgICAgIEJhciByZXN1bHQobV9pKTsKICAgICAgICBjb3V0IDw8ICh2b2lkKikoJnJlc3VsdCkgPDwgIiA9ICIgPDwgKHZvaWQqKXRoaXMgPDwgIiArICIgPDwgKHZvaWQqKSgmcmhzKSA8PCBlbmRsOwogICAgICAgIHJlc3VsdC5tX2kgKz0gcmhzLm1faTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICBvcGVyYXRvciBpbnQoKSBjb25zdCB7IHJldHVybiBtX2k7IH0KfTsKCmludCBtYWluKGludCBhcmdjLCBjb25zdCBjaGFyKiogYXJndikgewogICAgewogICAgICAgIEZvbyBhKDUpLCBiKDEwKSwgYzsKICAgICAgICBjID0gYSArIGI7CiAgICAgICAgY291dCA8PCAoaW50KWMgPDwgZW5kbDsKICAgIH0KICAgIAogICAgY291dCA8PCBlbmRsIDw8ICJOb3cgbGV0J3MgZG8gaXQgcHJvcGVybHkuIiA8PCBlbmRsIDw8IGVuZGw7CiAgICAKICAgIHsKICAgICAgICBCYXIgYSg1KSwgYigxMCksIGM7CiAgICAgICAgYyA9IGEgKyBiOwogICAgICAgIGNvdXQgPDwgKGludCljIDw8IGVuZGw7CiAgICB9CiAgICAKICAgIHJldHVybiAwOwp9