Давайте предстваим, что перед нами стоит задача вычисления расстояния между двумя точками. Наверняка для этого в первом приближении можно написать такое объявление функции
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-инициализации нужно перечислять все зчачения, включая по-умолчанию.