Московский государственный университет имени М.В.Ломоносова
Опубликован: 01.11.2004 | Доступ: свободный | Студентов: 11271 / 455 | Оценка: 4.12 / 4.01 | Длительность: 19:20:00
ISBN: 978-5-9556-0077-9
Специальности: Программист
Лекция 8:

Производные типы данных языка C++. Структуры, объединения и перечисления

< Лекция 7 || Лекция 8: 123 || Лекция 9 >
Аннотация: В лекции рассматриваются производные типы данных языка С++, дается определение структуры, описывается использование объединений и перечислений.

Структуры

Объявление структуры

Структуры языка C++ представляют поименованную совокупность компонентов, называемых полями, или элементами структуры. Элементом структуры может быть:

  • переменная любого допустимого типа;
  • битовое поле;
  • функция.

Объявление структуры имеет следующее формальное описание:

struct [имя_структуры] {
    тип_элемента_структуры  имя_ элемента1;
    тип_элемента_структуры  имя_ элемента2;
     ...
    тип_элемента_структуры  имя_ элементаN;
} [список_объявляемых_переменных];

Объявление структуры с битовыми полями имеет следующее формальное описание:

struct [имя_структуры] {
    тип_элемента_структуры  
        [имя_ элемента1] : число_бит;
    тип_элемента_структуры  
        [имя_ элемента2] : число_бит;
     ...
    тип_элемента_структуры  
        [имя_ элементаN] : число_бит;
} [список_объявляемых_переменных];

Возможно неполное объявление структуры, имеющее следующее формальное описание:

struct имя_структуры;

При отсутствии имени объявляемой структуры создается анонимная структура. При создании анонимной структуры обычно указывается список объявляемых переменных.

Список объявляемых переменных типа данной структуры может содержать:

  • имена переменных;
  • имена массивов;
  • указатели.

Например: struct sA {char a[2]; int i;} struA, struB[10], *struC;

Для использования указателя на структуру ему необходимо присвоить адрес переменной типа структуры.

Размер структуры с битовыми полями всегда кратен байту. Битовые поля можно определять для целочисленных переменных типа int, unsigned int, char и unsigned char. Одна структура одновременно может содержать и переменные, и битовые поля. Если для битового поля не задано имя элемента, то доступ к такому полю не разрешен, но количество указанных бит в структуре размещается.

Типом элемента структуры может быть:

  • другой структурный тип (допускаются вложенные структуры);
  • указатель на данный структурный тип;
  • неполно объявленный структурный тип;
  • любой другой базовый или производный тип, не ссылающийся рекурсивно на объявляемый структурный тип.

Например:

struct sA {char a[2], sA* this_struct;};  
    // Корректное объявление структуры 
struct sB;   
    // Неполное объявление структуры
struct sA {char a[2], sB* this_struct;};  
    // Корректное объявление структуры
struct sA {char a[2], sA this_struct;};  
    // Ошибочное объявление

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

Например:

struct structA { 
    structA *pA; int iA; } sA; 
    // pA указатель на структуру

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

Например:

struct POINT // Объявление структурного 
               // типа POINT 
{
   int x; // Объявление элементов x и y 
   int y; 
} POINT = { 50, 100 }; 
   // Эквивалентно записи POINT.x = 50; 
   // и POINT.y = 100;

< Лекция 7 || Лекция 8: 123 || Лекция 9 >
Александр Демьяненко
Александр Демьяненко

Можно ли сдавать один и тот же тест несколько раз?
Или же один и тот же тест можно сдать лишь однажды?

Максим Стогний
Максим Стогний

Добрый день!

Скажите, пожалуйста, если в терминологии объектно-ориентированного программирования функции также называются методами или методами - членами класса, в примере объявления указателя на метод использовали в формальном описании оба названия:

тип_метода (имя_класса::*имя_метода_указателя)
    (список параметров);
тип_функции (*имя_ функции_указателя)
    (список параметров);

при этом можно было  тип_функции во втором описании заменить на тип_метода? Т.е.:

тип_метода (*имя_ метода_указателя)
    (список параметров);