Рассмотрим пример: допустим мы хотим научить нашего солдата ходить. Вот как это будет выглядеть при использовании структур:
struct soldier
{
int x, y;
};
soldier a = (0,0);
a.x += 1; // боец переместился вправо
Конечно же лучше для передвижения написать функцию:
void move (int x, int y)
{}
А как должно выглядеть тело функции? Мы можем просто записать:
a.x += x;
a.y += y;
Но тогда, если у нас будет несколько переменных типа soldier, мы не сможем применить функцию move к ним. Поэтому нам необходимо передавать ещё один аргумент - структурную переменную чьи поля будут изменены. Итак:
soldier move (soldier a, int x, int y)
{
a.x += x;
a.y += y;
return a;
}
Теперь посмотрим, как работать с этой функцией:
soldier b = (0, 0);
soldier c = (1, 1);
b = move(b, 0, 1); // двигаем b вверх
c = move(c, 0, -1); // двигаем c вниз
В функцию передаётся переменная soldier, но её нужно и вернуть из функции. В функцию дополнительно передаётся 8 байт (поля x,y переменной soldier) и из функции возвращается восемь байт. Лучше конечно передавать soldier по ссылке.
Смотрите сколько сложностей! С классами всё намного проще:
class soldier
{
public:
int x,y;
void move (int dx, int dy)
{
x += dx;
y += dy;
}
};
Внутри функции мы определили функцию move. Заметьте, в неё не нужно передавать объекты класса - метод сам знает, какой объект его вызвал. dx и dy - значения на которые изменятся поля класса.
Как всё это работает:
soldier a = (0,0);
soldier b = (5,6);
a.move(1,1);
b.move(-2,3);
Методы класса вызываются почти также как и обычные функции. При этом, метод знает, какой объект его вызвал и меняться будут поля нужного объекта.