This repository has been archived on 2023-05-13. You can view files and clone it, but cannot push or open issues or pull requests.
mipt_cpp/seminar02_encapsulation/classroom_tasks/code/1point/01point_solution.cpp
2022-09-14 19:05:27 +03:00

97 lines
3 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
Обратите внимание на следующие моменты в этом решении:
1) При переносе функций внутрь класса у них стало на 1 аргумент меньше
Просто потому что все методы неявно принимают вызывающий их объект
Например, если a это точка, то при вызове:
a.norm()
метод norm 'знает', что его вызвала имено точка a и может доступаться до её полей x и y
2) Перегруженные операторы тоже могут быть методами
При этом оператор преобразуется следующим образом:
a @ b -> a.operator@(b)
где на месте @ может быть любой бинарный оператор
Например, сложение преобразуется так:
a + b -> a.operator+(b)
Обратите внимание, что перегруженный оператор может стать методом только первого аргумента
3) Перегрузка оператора << для типов std::ostream и Point
Для более удобного вывода на экран можно перегрузить этот оператор
Когда компилятор встретит выражение cout << a где cout имеет тип std::ostream, а имеет тип Point
то он вызовет эту функцию.
Эта функция должна вызывать ссылку на cout так как результатом cout << a тоже должен быть cout
чтобы мы могли выводить цепочкой, например так: cout << a << b << endl
*/
#include <iostream>
#include <iomanip>
#include <cmath>
using std::cout, std::endl;
struct Point
{
float x, y;
Point operator+(Point b) const
{
Point result = {x + b.x, y + b.y};
return result;
}
float norm() const
{
return std::sqrt(x * x + y * y);
}
Point operator*(float k) const
{
Point result = {k * x, k * y};
return result;
}
void normalize()
{
float normv = norm();
x /= normv;
y /= normv;
}
};
std::ostream& operator<<(std::ostream& out, Point a)
{
out << std::setprecision(2) << "(" << a.x << ", " << a.y << ")";
return out;
}
int main()
{
Point a = {7.2, 3.1};
Point b = {-4.6, 2.4};
cout << a << endl;
cout << b << endl;
Point c = a + b;
cout << c << endl;
cout << c * 1.5f << endl;
c.normalize();
cout << c << endl;
}