#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 += 100; // до a додається 100 → (101,102), результат присвоюється b
a + b; // створюється тимчасовий вектор (202,204), але не використовується
cout << b << endl; // вивід координат b (101,102)
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKLy8g0J7Qs9C+0LvQvtGI0LXQvdC90Y8g0YjQsNCx0LvQvtC90L3QvtCz0L4g0LrQu9Cw0YHRgyBWZWMyRC4KLy8gPHR5cGVuYW1lIFQ+INC+0LfQvdCw0YfQsNGULCDRidC+INC60L7QvtGA0LTQuNC90LDRgtC4IHgg0YLQsCB5INC80L7QttGD0YLRjCDQsdGD0YLQuCDQsdGD0LTRjC3Rj9C60L7Qs9C+INGC0LjQv9GDIChpbnQsIGRvdWJsZSwgZmxvYXQg0YLQvtGJ0L4pLgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KY2xhc3MgVmVjMkQgewogICAgVCB4LCB5OyAvLyDQutC+0L7RgNC00LjQvdCw0YLQuCDQstC10LrRgtC+0YDQsApwdWJsaWM6CiAgICAvLyDQmtC+0L3RgdGC0YDRg9C60YLQvtGAINC30LAg0LfQsNC80L7QstGH0YPQstCw0L3QvdGP0Lw6IHg9MCwgeT0xCiAgICBWZWMyRCgpOiB4KDApLCB5KDEpIHsKICAgICAgICBjb3V0IDw8ICJDb25zdHJ1Y3RvciAiIDw8IHggPDwgIiAiIDw8IHkgPDwgZW5kbDsKICAgIH0KCiAgICAvLyDQmtC+0L3RgdGC0YDRg9C60YLQvtGAINC3INC/0LDRgNCw0LzQtdGC0YDQsNC80LgKICAgIFZlYzJEKFQgeCwgVCB5KTogeCh4KSwgeSh5KSB7CiAgICAgICAgY291dCA8PCAiQ29uc3RydWN0b3IgIiA8PCB4IDw8ICIgIiA8PCB5IDw8IGVuZGw7CiAgICB9CgogICAgLy8g0JTQtdGB0YLRgNGD0LrRgtC+0YA6INCy0LjQutC70LjQutCw0ZTRgtGM0YHRjyDQv9GA0Lgg0LfQvdC40YnQtdC90L3RliDQvtCxJ9GU0LrRgtCwCiAgICB+VmVjMkQoKSB7CiAgICAgICAgY291dCA8PCAiRGVzdHJ1Y3RvciAiIDw8IHggPDwgIiAiIDw8IHkgPDwgZW5kbDsKICAgIH0KCiAgICAvLyDQn9C10YDQtdCy0LDQvdGC0LDQttC10L3QvdGPINC+0L/QtdGA0LDRgtC+0YDQsCDQv9GA0LjRgdCy0L7RlNC90L3RjyAiPSIKICAgIFZlYzJEPFQ+JiBvcGVyYXRvcj0oY29uc3QgVmVjMkQ8VD4mIHJpZ2h0KSB7CiAgICAgICAgeCA9IHJpZ2h0Lng7CiAgICAgICAgeSA9IHJpZ2h0Lnk7CiAgICAgICAgcmV0dXJuICp0aGlzOwogICAgfQoKICAgIC8vINCf0LXRgNC10LLQsNC90YLQsNC20LXQvdC90Y8g0L7Qv9C10YDQsNGC0L7RgNCwICIrPSIg0LTQu9GPINC00L7QtNCw0LLQsNC90L3RjyDQutC+0L3RgdGC0LDQvdGC0Lgg0LTQviDQutC+0L7RgNC00LjQvdCw0YIKICAgIFZlYzJEPFQ+JiBvcGVyYXRvcis9KFQgYykgewogICAgICAgIHggKz0gYzsgeSArPSBjOwogICAgICAgIHJldHVybiAqdGhpczsKICAgIH0KCiAgICAvLyDQn9C+0YHRgtGE0ZbQutGB0L3QuNC5INGW0L3QutGA0LXQvNC10L3RgiAob2JqKyspCiAgICBWZWMyRDxUPiYgb3BlcmF0b3IrKyhpbnQpIHsKICAgICAgICB4Kys7IHkrKzsKICAgICAgICByZXR1cm4gKnRoaXM7CiAgICB9CgogICAgLy8g0J/RgNC10YTRltC60YHQvdC40Lkg0ZbQvdC60YDQtdC80LXQvdGCICgrK29iaikKICAgIFZlYzJEPFQ+JiBvcGVyYXRvcisrKCkgewogICAgICAgIHgrKzsgeSsrOwogICAgICAgIHJldHVybiAqdGhpczsKICAgIH0KCiAgICAvLyDQn9C10YDQtdCy0LDQvdGC0LDQttC10L3QvdGPINC+0L/QtdGA0LDRgtC+0YDQsCAiKyIg0LTQu9GPINC00L7QtNCw0LLQsNC90L3RjyDQtNCy0L7RhSDQstC10LrRgtC+0YDRltCyCiAgICBWZWMyRDxUPiBvcGVyYXRvcisoY29uc3QgVmVjMkQ8VD4mIHJpZ2h0KSB7CiAgICAgICAgcmV0dXJuIFZlYzJEPFQ+KHggKyByaWdodC54LCB5ICsgcmlnaHQueSk7CiAgICB9Cgpwcml2YXRlOgogICAgLy8g0JTRgNGD0LbQvdGPINGE0YPQvdC60YbRltGPINC00LvRjyDQstC40LLQtdC00LXQvdC90Y8g0LLQtdC60YLQvtGA0LAg0YMg0L/QvtGC0ZbQugogICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQxPiAKICAgIGZyaWVuZCBvc3RyZWFtJiBvcGVyYXRvcjw8KG9zdHJlYW0mIG9zLCBjb25zdCBWZWMyRDxUMT4mIGEpOyAgCn07CgovLyDQoNC10LDQu9GW0LfQsNGG0ZbRjyDQvtC/0LXRgNCw0YLQvtGA0LAg0LLQuNCy0LXQtNC10L3QvdGPIDw8CnRlbXBsYXRlIDx0eXBlbmFtZSBUPgpvc3RyZWFtJiBvcGVyYXRvcjw8KG9zdHJlYW0mIG9zLCBjb25zdCBWZWMyRDxUPiYgYSkgeyAgCiAgICBvcyA8PCBhLnggPDwgJyAnIDw8IGEueSA8PCBlbmRsOyAgCiAgICByZXR1cm4gb3M7ICAKfQoKaW50IG1haW4oKSB7CiAgICBWZWMyRDxkb3VibGU+IGEoMSwyKTsgICAvLyDRgdGC0LLQvtGA0LXQvdC90Y8g0LLQtdC60YLQvtGA0LAg0Lcg0LrQvtC+0YDQtNC40L3QsNGC0LDQvNC4ICgxLDIpCiAgICBWZWMyRDxkb3VibGU+IGI7ICAgICAgICAvLyDRgdGC0LLQvtGA0LXQvdC90Y8g0LLQtdC60YLQvtGA0LAg0LfQsCDQt9Cw0LzQvtCy0YfRg9Cy0LDQvdC90Y/QvCAoMCwxKQogICAgKytiOyAgICAgICAgICAgICAgICAgICAgLy8g0L/RgNC10YTRltC60YHQvdC40Lkg0ZbQvdC60YDQtdC80LXQvdGCOiAoMCwxKSDihpIgKDEsMikKICAgIGNvdXQgPDwgYjsgICAgICAgICAgICAgIC8vINCy0LjQstGW0LQg0LrQvtC+0YDQtNC40L3QsNGCINCy0LXQutGC0L7RgNCwIGIKICAgIGIgPSBhICs9IDEwMDsgICAgICAgICAgIC8vINC00L4gYSDQtNC+0LTQsNGU0YLRjNGB0Y8gMTAwIOKGkiAoMTAxLDEwMiksINGA0LXQt9GD0LvRjNGC0LDRgiDQv9GA0LjRgdCy0L7RjtGU0YLRjNGB0Y8gYgogICAgYSArIGI7ICAgICAgICAgICAgICAgICAgLy8g0YHRgtCy0L7RgNGO0ZTRgtGM0YHRjyDRgtC40LzRh9Cw0YHQvtCy0LjQuSDQstC10LrRgtC+0YAgKDIwMiwyMDQpLCDQsNC70LUg0L3QtSDQstC40LrQvtGA0LjRgdGC0L7QstGD0ZTRgtGM0YHRjwogICAgY291dCA8PCBiIDw8IGVuZGw7ICAgICAgLy8g0LLQuNCy0ZbQtCDQutC+0L7RgNC00LjQvdCw0YIgYiAoMTAxLDEwMikKICAgIHJldHVybiAwOwp9Cgo=