Основы программирования на С++ для начинающих

Структуры в C++. Часть 2





структуры с++, структуры c++, struct c++. вложенные структуры

Со структурами C++ мы предварительно познакомились в предыдущей статье. Продолжаем знакомство.

Определение структуры желательно располагать за пределами main() функции. Тогда работать с ней смогут и другие определенные программистом функции, как показано в нашем примере из первой части. Такое объявление называют внешним.

Инициализация. Элементы структуры можно инициализировать сразу при объявлении объекта.

Объявляем объект volume1 в строке 13 и проводим его инициализацию. Похоже на инициализацию элементов массива – в фигурных скобках и через запятую. Эти данные запишутся в соответствующие элементы структуры по порядку. В каком порядке определены элементы в структуре – в таком и произойдет запись значений. Операцию равно можно не использовать (согласно C++11).

Рассмотрим такую инициализацию на примере с более сложной структурой WonderfulWoman :

структуры с++, структуры c++, struct c++. вложенные структуры

Объект этой структуры можно инициализировать так:

структуры с++, структуры c++, struct c++. вложенные структуры

Но если структура содержит больше двух-трех элементов -желательно так не делать. Это немного запутывает и усложняет читаемость и понимание программы.

Объявление объектов. Создать объект структуры можно сразу во время её определения. Для этого необходимо дать имя объекту между точкой с запятой и закрывающей фигурной скобкой:

В С++ есть возможность определить структуру без дескриптора (без имени типа):

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

Присваивание (=) для структур. Для объектов одной структуры можно применить операцию присваивания = . Операция присвоит элементам одного объекта значения элементов второго объекта.

Это так называемое поэлементное или почленное присваивание. На экране:

структуры с++, структуры c++, struct c++. вложенные структуры

Сработало – все элементы объекта структуры volume2 стали равны элементам объекта volume1.

Память занимаемая структурой. Рассмотрим пример: используя оператор sizeof, узнаем сколько памяти занимает каждый элемент структуры в отдельности. Посчитаем общий объем памяти элементов. Потом применим sizeof к объекту структуры и увидим, что размеры не совпадают.

На экране:

структуры с++, структуры c++, struct c++. вложенные структуры

sizeof показал нам сколько памяти занимает каждый элемент структуры HandsomeMan. Мы эти значения суммировали и получили 25. То есть по идее структура должна занимать 25 байт оперативной памяти. Но когда мы применяем оператор sizeof к структуре – получаем значение 28.

Размер объекта структуры не всегда равен сумме размеров его элементов. Так случается из-за выравнивания элементов разной длины. Поэтому в структуре могут встречаться безымянные участки памяти. Если вам надо знать сколько в действительности занимает структура в памяти – примените sizeof , как в примере.

Это видео из предыдущего урока. Кто не смотрел – уделите время




Мы узнали как определять структуры, как объявлять и инициализировать их объекты. Если нам понадобится создать больше чем 2-3 объекта структуры, тогда лучше создать массив структур. Эту тему рассмотрим в следующей статье.

Чтобы поддержать наш сайт – нажмите на копилку и выберите любой удобный способ.

Рассылка новых уроков по программированию:

Структуры в C++. Часть 2
4.2 (83.33%) 6 votes

5 thoughts on “Структуры в C++. Часть 2

  1. странно, но с именем в структуре беда, а точнее когда вводишь
    volume = { “имя”, и тд ;

  2. Дан массив, в котором хранятся данные о расписании поездов на сего-
    дняшний день: номер поезда, название (т.е. откуда – куда, например, Ново-
    российск-Москва), время прибытия на станцию и время отправления (часы,
    минуты). По данному времени определить, какие из поездов стоят сейчас на
    станции.

  3. Нужно вывести данные тех студентов, у которых оценки по математике 8 или 9 и фамилия начинается на А. Почему нельзя нельзя сравнивать адрес и что-то ещё в операторе if??
    #include
    using namespace std;

    struct Grades // эту структуру мы вложим в структуру Student
    {
    int physics;
    int maths;
    int informatics;
    int chemistry;
    };

    struct Student
    {
    char surname[32];
    int year_of_birth;
    int number_of_groope;
    Grades semester_grades; // вложенная структура(оценки за семестр)
    double average_score;//средний балл
    };

    void showData( Student *Obj);
    void showData_input(Student *Obj);

    int main()
    {
    setlocale(LC_ALL, “rus”);

    Student data[1];

    for (int i = 0; i < 3; i++)
    {
    cout << i + 1 << " student: " << endl;
    showData_input(&data[i]);
    showData(&data[i]);
    if ((&data[i].surname[0]) == 'A' && (&data[i].semester_grades.maths == 8 || 9))
    {
    showData(&data[i]);
    }

    }

    system("pause");
    return 0;
    }

    void showData( Student *Obj)
    {
    setlocale(LC_ALL, "rus");
    cout << "Фамилия: " <surname << endl;
    cout << "Год рождения: " <year_of_birth << endl;
    cout << "Номер группы: " <number_of_groope << endl;
    cout << " Оценки за семестр: \nФизика: " <semester_grades.physics << "Математика: " <semester_grades.maths << "Информатика: " <semester_grades.informatics<<"Химия: " <semester_grades.chemistry << endl;
    cout << "Средний балл: "<average_score;
    cout << endl;

    }
    void showData_input(Student *Obj)
    {
    setlocale(LC_ALL, "rus");
    cout << "__________________" << endl;
    cout << "Input student data" << endl;
    cout << "__________________" << endl;

    cout <> Obj->surname;
    cout <> Obj->year_of_birth;
    cout <> Obj->number_of_groope;
    cout <> Obj->semester_grades.physics >> Obj->semester_grades.maths >> Obj->semester_grades.informatics >> Obj-> semester_grades.chemistry;
    cout <> Obj->average_score;
    cout << endl;

    }

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *