#include <iostream>
using namespace std;
int idx = 0;
class CTest {
public:
int x;
int z;
CTest(int x) {
z = ++idx;
cout << "Create " << x << ' ' << z << endl;
this->x = x;
};
CTest(const CTest & src) {
z = ++idx;
cout << "Copy " << src.x << ' ' << z << " <- " << src.z << endl;
this->x = src.x;
};
~CTest() {
cout << "Destroy " << x << ' ' << z << endl;;
};
CTest & operator=(const CTest & src) {
cout << "Assign " << x << " (" << this->z << " <- " << src.z << ")" << endl;
this->x = src.x;
return *this;
};
};
CTest g(10);
const CTest & getExists() {
cout << "Call getExists" << endl;
return g;
}
CTest createNew() {
cout << "Call createNew" << endl;
CTest t(20);
return t;
}
void test(const CTest & t) {
cout << "Test " << t.x << ' ' << t.z << endl;
}
int main() {
cout << "======== ? ========\n";
int c = 1;
test(c ? getExists() : createNew());
cout << "====== getExists ========\n";
test(getExists());
cout << "======= getExistsVar =========\n";
const CTest & v = getExists();
cout << "Call test()\n";
test(v);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKaW50IGlkeCA9IDA7CgpjbGFzcyBDVGVzdCB7CnB1YmxpYzoKCWludCB4OwoJaW50IHo7CglDVGVzdChpbnQgeCkgewoJCXogPSArK2lkeDsKCQljb3V0IDw8ICJDcmVhdGUgIiA8PCB4IDw8ICcgJyA8PCB6IDw8IGVuZGw7CgkJdGhpcy0+eCA9IHg7Cgl9OwoJCglDVGVzdChjb25zdCBDVGVzdCAmIHNyYykgewoJCXogPSArK2lkeDsKCQljb3V0IDw8ICJDb3B5ICIgPDwgc3JjLnggPDwgJyAnIDw8IHogPDwgIiA8LSAiIDw8IHNyYy56IDw8IGVuZGw7CgkJdGhpcy0+eCA9IHNyYy54OwoJfTsKCgl+Q1Rlc3QoKSB7CgkJY291dCA8PCAiRGVzdHJveSAiIDw8IHggPDwgJyAnIDw8IHogPDwgZW5kbDs7Cgl9OwoJCglDVGVzdCAmIG9wZXJhdG9yPShjb25zdCBDVGVzdCAmIHNyYykgewoJCWNvdXQgPDwgIkFzc2lnbiAiIDw8IHggPDwgIiAoIiA8PCB0aGlzLT56IDw8ICIgPC0gIiA8PCBzcmMueiA8PCAiKSIgPDwgZW5kbDsKCQl0aGlzLT54ID0gc3JjLng7CgkJcmV0dXJuICp0aGlzOwoJfTsKfTsKCkNUZXN0IGcoMTApOwoKY29uc3QgQ1Rlc3QgJiBnZXRFeGlzdHMoKSB7Cgljb3V0IDw8ICJDYWxsIGdldEV4aXN0cyIgPDwgZW5kbDsKCXJldHVybiBnOwp9CgpDVGVzdCBjcmVhdGVOZXcoKSB7Cgljb3V0IDw8ICJDYWxsIGNyZWF0ZU5ldyIgPDwgZW5kbDsKCUNUZXN0IHQoMjApOwoJcmV0dXJuIHQ7Cn0KCnZvaWQgdGVzdChjb25zdCBDVGVzdCAmIHQpIHsKCWNvdXQgPDwgIlRlc3QgIiA8PCB0LnggPDwgJyAnIDw8IHQueiA8PCBlbmRsOwp9CgppbnQgbWFpbigpIHsKCWNvdXQgPDwgIj09PT09PT09ID8gPT09PT09PT1cbiI7CglpbnQgYyA9IDE7Cgl0ZXN0KGMgPyBnZXRFeGlzdHMoKSA6IGNyZWF0ZU5ldygpKTsKCQoJY291dCA8PCAiPT09PT09IGdldEV4aXN0cyA9PT09PT09PVxuIjsKCXRlc3QoZ2V0RXhpc3RzKCkpOwoJCgljb3V0IDw8ICI9PT09PT09IGdldEV4aXN0c1ZhciA9PT09PT09PT1cbiI7Cgljb25zdCBDVGVzdCAmIHYgPSBnZXRFeGlzdHMoKTsKCWNvdXQgPDwgIkNhbGwgdGVzdCgpXG4iOwoJdGVzdCh2KTsKCXJldHVybiAwOwp9