#include <iostream>
using namespace std;
// Оголошення шаблонного класу Vec2D.
// <typename T> означає, що координати x та y можуть бути будь-якого типу (int, double, float тощо).
template <typename T>
class Vec2D {
T x, y; // координати вектора
public:
// Конструктор за замовчуванням: x=0, y=1
Vec2D(): x(0), y(1) {
cout << "Constructor " << x << " " << y << endl;
}
// Конструктор з параметрами
Vec2D(T x, T y): x(x), y(y) {
cout << "Constructor " << x << " " << y << endl;
}
// Деструктор: викликається при знищенні об’єкта
~Vec2D() {
cout << "Destructor " << x << " " << y << endl;
}
// Перевантаження оператора присвоєння "="
Vec2D<T>& operator=(const Vec2D<T>& right) {
x = right.x;
y = right.y;
return *this;
}
// Перевантаження оператора "+=" для додавання константи до координат
Vec2D<T>& operator+=(T c) {
x += c; y += c;
return *this;
}
// Постфіксний інкремент (obj++)
Vec2D<T>& operator++(int) {
x++; y++;
return *this;
}
// Префіксний інкремент (++obj)
Vec2D<T>& operator++() {
x++; y++;
return *this;
}
// Перевантаження оператора "+" для додавання двох векторів
Vec2D<T> operator+(const Vec2D<T>& right) {
return Vec2D<T>(x + right.x, y + right.y);
}
private:
// Дружня функція для виведення вектора у потік
template <typename T1>
friend ostream& operator<<(ostream& os, const Vec2D<T1>& a);
};
// Реалізація оператора виведення <<
template <typename T>
ostream& operator<<(ostream& os, const Vec2D<T>& a) {
os << a.x << ' ' << a.y << endl;
return os;
}
int main() {
Vec2D<double> a(1,2); // створення вектора з координатами (1,2)
Vec2D<double> b; // створення вектора за замовчуванням (0,1)
++b; // префіксний інкремент: (0,1) → (1,2)
cout << b;
// вивід координат вектора b
b=a;
cout<<"b="<<b;
b = a += 100; // до a додається 100 → (101,102), результат присвоюється b
b=a + b; // створюється тимчасовий вектор (202,204), але не використовується
cout << b << endl; // вивід координат b (101,102)
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKLy8g0J7Qs9C+0LvQvtGI0LXQvdC90Y8g0YjQsNCx0LvQvtC90L3QvtCz0L4g0LrQu9Cw0YHRgyBWZWMyRC4KLy8gPHR5cGVuYW1lIFQ+INC+0LfQvdCw0YfQsNGULCDRidC+INC60L7QvtGA0LTQuNC90LDRgtC4IHgg0YLQsCB5INC80L7QttGD0YLRjCDQsdGD0YLQuCDQsdGD0LTRjC3Rj9C60L7Qs9C+INGC0LjQv9GDIChpbnQsIGRvdWJsZSwgZmxvYXQg0YLQvtGJ0L4pLgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KY2xhc3MgVmVjMkQgewogICAgVCB4LCB5OyAvLyDQutC+0L7RgNC00LjQvdCw0YLQuCDQstC10LrRgtC+0YDQsApwdWJsaWM6CiAgICAvLyDQmtC+0L3RgdGC0YDRg9C60YLQvtGAINC30LAg0LfQsNC80L7QstGH0YPQstCw0L3QvdGP0Lw6IHg9MCwgeT0xCiAgICBWZWMyRCgpOiB4KDApLCB5KDEpIHsKICAgICAgICBjb3V0IDw8ICJDb25zdHJ1Y3RvciAiIDw8IHggPDwgIiAiIDw8IHkgPDwgZW5kbDsKICAgIH0KCiAgICAvLyDQmtC+0L3RgdGC0YDRg9C60YLQvtGAINC3INC/0LDRgNCw0LzQtdGC0YDQsNC80LgKICAgIFZlYzJEKFQgeCwgVCB5KTogeCh4KSwgeSh5KSB7CiAgICAgICAgY291dCA8PCAiQ29uc3RydWN0b3IgIiA8PCB4IDw8ICIgIiA8PCB5IDw8IGVuZGw7CiAgICB9CgogICAgLy8g0JTQtdGB0YLRgNGD0LrRgtC+0YA6INCy0LjQutC70LjQutCw0ZTRgtGM0YHRjyDQv9GA0Lgg0LfQvdC40YnQtdC90L3RliDQvtCx4oCZ0ZTQutGC0LAKICAgIH5WZWMyRCgpIHsKICAgICAgICBjb3V0IDw8ICJEZXN0cnVjdG9yICIgPDwgeCA8PCAiICIgPDwgeSA8PCBlbmRsOwogICAgfQoKICAgIC8vINCf0LXRgNC10LLQsNC90YLQsNC20LXQvdC90Y8g0L7Qv9C10YDQsNGC0L7RgNCwINC/0YDQuNGB0LLQvtGU0L3QvdGPICI9IgogICAgVmVjMkQ8VD4mIG9wZXJhdG9yPShjb25zdCBWZWMyRDxUPiYgcmlnaHQpIHsKICAgICAgICB4ID0gcmlnaHQueDsKICAgICAgICB5ID0gcmlnaHQueTsKICAgICAgICByZXR1cm4gKnRoaXM7CiAgICB9CgogICAgLy8g0J/QtdGA0LXQstCw0L3RgtCw0LbQtdC90L3RjyDQvtC/0LXRgNCw0YLQvtGA0LAgIis9IiDQtNC70Y8g0LTQvtC00LDQstCw0L3QvdGPINC60L7QvdGB0YLQsNC90YLQuCDQtNC+INC60L7QvtGA0LTQuNC90LDRggogICAgVmVjMkQ8VD4mIG9wZXJhdG9yKz0oVCBjKSB7CiAgICAgICAgeCArPSBjOyB5ICs9IGM7CiAgICAgICAgcmV0dXJuICp0aGlzOwogICAgfQoKICAgIC8vINCf0L7RgdGC0YTRltC60YHQvdC40Lkg0ZbQvdC60YDQtdC80LXQvdGCIChvYmorKykKICAgIFZlYzJEPFQ+JiBvcGVyYXRvcisrKGludCkgewogICAgICAgIHgrKzsgeSsrOwogICAgICAgIHJldHVybiAqdGhpczsKICAgIH0KCiAgICAvLyDQn9GA0LXRhNGW0LrRgdC90LjQuSDRltC90LrRgNC10LzQtdC90YIgKCsrb2JqKQogICAgVmVjMkQ8VD4mIG9wZXJhdG9yKysoKSB7CiAgICAgICAgeCsrOyB5Kys7CiAgICAgICAgcmV0dXJuICp0aGlzOwogICAgfQoKICAgIC8vINCf0LXRgNC10LLQsNC90YLQsNC20LXQvdC90Y8g0L7Qv9C10YDQsNGC0L7RgNCwICIrIiDQtNC70Y8g0LTQvtC00LDQstCw0L3QvdGPINC00LLQvtGFINCy0LXQutGC0L7RgNGW0LIKICAgIFZlYzJEPFQ+IG9wZXJhdG9yKyhjb25zdCBWZWMyRDxUPiYgcmlnaHQpIHsKICAgICAgICByZXR1cm4gVmVjMkQ8VD4oeCArIHJpZ2h0LngsIHkgKyByaWdodC55KTsKICAgIH0KCnByaXZhdGU6CiAgICAvLyDQlNGA0YPQttC90Y8g0YTRg9C90LrRhtGW0Y8g0LTQu9GPINCy0LjQstC10LTQtdC90L3RjyDQstC10LrRgtC+0YDQsCDRgyDQv9C+0YLRltC6CiAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVDE+IAogICAgZnJpZW5kIG9zdHJlYW0mIG9wZXJhdG9yPDwob3N0cmVhbSYgb3MsIGNvbnN0IFZlYzJEPFQxPiYgYSk7ICAKfTsKCi8vINCg0LXQsNC70ZbQt9Cw0YbRltGPINC+0L/QtdGA0LDRgtC+0YDQsCDQstC40LLQtdC00LXQvdC90Y8gPDwKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cm9zdHJlYW0mIG9wZXJhdG9yPDwob3N0cmVhbSYgb3MsIGNvbnN0IFZlYzJEPFQ+JiBhKSB7ICAKICAgIG9zIDw8IGEueCA8PCAnICcgPDwgYS55IDw8IGVuZGw7ICAKICAgIHJldHVybiBvczsgIAp9CgppbnQgbWFpbigpIHsKICAgIFZlYzJEPGRvdWJsZT4gYSgxLDIpOyAgIC8vINGB0YLQstC+0YDQtdC90L3RjyDQstC10LrRgtC+0YDQsCDQtyDQutC+0L7RgNC00LjQvdCw0YLQsNC80LggKDEsMikKICAgIFZlYzJEPGRvdWJsZT4gYjsgICAgICAgIC8vINGB0YLQstC+0YDQtdC90L3RjyDQstC10LrRgtC+0YDQsCDQt9CwINC30LDQvNC+0LLRh9GD0LLQsNC90L3Rj9C8ICgwLDEpCiAgICArK2I7ICAgICAgICAgICAgICAgICAgICAvLyDQv9GA0LXRhNGW0LrRgdC90LjQuSDRltC90LrRgNC10LzQtdC90YI6ICgwLDEpIOKGkiAoMSwyKQogICAgY291dCA8PCBiOyAgICAKICAgIC8vINCy0LjQstGW0LQg0LrQvtC+0YDQtNC40L3QsNGCINCy0LXQutGC0L7RgNCwIGIKICAgIGI9YTsKICAgIGNvdXQ8PCJiPSI8PGI7CiAgICBiID0gYSArPSAxMDA7ICAgICAgICAgICAvLyDQtNC+IGEg0LTQvtC00LDRlNGC0YzRgdGPIDEwMCDihpIgKDEwMSwxMDIpLCDRgNC10LfRg9C70YzRgtCw0YIg0L/RgNC40YHQstC+0Y7RlNGC0YzRgdGPIGIKICAgIGI9YSArIGI7ICAgICAgICAgICAgICAgICAgLy8g0YHRgtCy0L7RgNGO0ZTRgtGM0YHRjyDRgtC40LzRh9Cw0YHQvtCy0LjQuSDQstC10LrRgtC+0YAgKDIwMiwyMDQpLCDQsNC70LUg0L3QtSDQstC40LrQvtGA0LjRgdGC0L7QstGD0ZTRgtGM0YHRjwogICAgY291dCA8PCBiIDw8IGVuZGw7ICAgICAgLy8g0LLQuNCy0ZbQtCDQutC+0L7RgNC00LjQvdCw0YIgYiAoMTAxLDEwMikKICAgIHJldHVybiAwOwp9Cg==