Структура

Давайте предстваим, что перед нами стоит задача вычисления расстояния между двумя точками. Наверняка для этого в первом приближении можно написать такое объявление функции

double length(double x1, double y1, double x2, double y2);

где x1, y1 - координаыты первой точки, x2, y2 - второй. Налицо излишняя многословность в объявлении координат точек. Что если представить точку как объект из координат по x и y? Для этого в языке С++ есть специальная струкрутура данных - струртура (struct). Функцию выше уже можно переписать как:

struct Point {
    double x;
    double y;
};

double length(Point p1, Point p2);

Одна из самых простых ошибок в C++ — забыть точку с запятой в конце объявления структуры. Это приведет к ошибке компиляции в следующей строке кода.

Но и здесь можно не останалвиваться, сгруппировав точки, и вычислять расстояние уже не между точками, а расстояние сегмента:

struct Point {
    double x;
    double y;
};

struct Segment {
    Point p1;
    Point p2;
};

double length(Segment s) {
    double dx = s.p1.x  s.p2.x;
    double dy = s.p1.y  s.p2.y;
    return sqrt(dx * dx + dy * dy);
}

Как мы видем из примера, если мы передаем структуру по значению доступ к элементам этой стурктуры идет через оператор ..

Структуру, как и любой примитив можно передавать через указатель.

double length(Segment* s) {
    double dx = s->p1.x  s->p2.x;
    double dy = s->p1.y  s->p2.y;
    return sqrt(dx * dx + dy * dy);
}

При передачи через указатель доступ к элементам структуры идет через опреатор ->.

Инициализация структуры

Инициализацию структуры можно произвести следующим образом:

int main() {
    // классическое создание и инициалиазция элементов структуры
    Point p1;
    p1.x = 5;
    p1.y = 5;
    
    // создание и инициализация структура с помощью списка инциализаторов
    // x будет присоено 10, y будет присвоено 20 согласно порядку объявленному в Point
    Point p2 = {10, 20};

    // uniform-инифиализация. Похож на пример выше, но менее многословен
    // только начиная с C++11
    Segment s {p1, p2};
    double d = length(s);
    cout << d;
    return 0;
}

В C++11 также элементам структур можно присваивать значения по умолчанию:

struct Point {
    double x = 100;
    double y = 200;
}

int main() {
    Point p;
    cout << p.x << " " << p.y; // 100 200
    return 0;
}

При объявлении значений по умолчанию в случае uniform-инициализации нужно перечислять все зчачения, включая по-умолчанию.