Классы и структуры (C++) | Microsoft Learn
Twitter LinkedIn Facebook Адрес электронной почты
- Статья
- Чтение занимает 2 мин
В этом разделе приводится информация о классах и структурах C++. В C++ эти конструкции идентичны, за исключением того факта, что структуры по умолчанию открыты для доступа, а классы — закрыты.
Классы и структуры являются конструкциями, в которых пользователь определяет собственные типы. Классы и структуры могут включать данные-члены и функции-члены, позволяющие описывать состояние и поведение данного типа.
В этой статье содержатся следующие разделы:
class
struct
Общие сведения о члене класса
Контроль доступа участника
Наследование
Статические члены
Преобразования определяемых пользователем типов
Изменяемые члены данных (изменяемый спецификатор)
Объявления вложенных классов
Типы анонимных классов
Указатели на элементы
этот указатель
Битовые поля C++
Существует три типа классов: структура, класс и объединение. Они объявляются с помощью ключевых слов структуры, класса и объединения . В следующей таблице показаны различия между этими тремя типами классов.
Дополнительные сведения о профсоюзах см. в разделе «Профсоюзы». Сведения о классах и структурых в C++/CLI и C++/CX см. в разделе «Классы и структуры».
Управление доступом и ограничения для структур, классов и объединений
Структуры | Классы | Объединения |
---|---|---|
Ключевое слово для класса: struct | Ключевое слово для класса: class | Ключевое слово для класса: union |
Доступ по умолчанию: public (открытый). | Доступ по умолчанию: private (закрытый). | |
Нет ограничений на использование | Нет ограничений на использование | Используется только один член за один раз |
Справочник по языку C++
Класс Python как структура данных, подобная языку C.
Иногда полезно иметь тип данных, подобный структуре struct
в языке C объединяющий несколько именованных элементов данных.
Самый простой вариант создание структуры подобной C — это создание структуры из пустого объявления класса!
Например:
class Employee: """Структура Employee""" pass # Создаем пустую структуру john = Employee() # Заполняем члены структуры `Employee` >>> john.name = 'John Doe' >>> john.dept = 'computer lab' >>> john.salary = 1000 # Доступ к членам структуры `Employee` >>> john.dept # 'computer lab' # Изменение членов структуры `Employee` >>> john.salary = 1500 >>> john.salary # 1500
Или можно использовать объявление класса с атрибутом __slots__
. Атрибут __slots__
призван уменьшить накладные расходы памяти, а так же он может ускорить доступ к атрибутам.
Небольшое предостережение: необходимо только один раз объявлять определенный слот в дереве наследования.
class Employee: __slots__ = ['name', 'dept', 'salary'] # Создаем пустую структуру >>> john = Employee() # Заполняем члены структуры `Employee` >>> john.name = 'John Doe' >>> john.dept = 'computer lab' >>> john.salary = 1000 # Доступ к членам структуры `Employee` >>> john.name # 'John Doe' # Изменение членов структуры `Employee` >>> john.salary = 1500 >>> john.salary # 1500
Классы в Python могут иметь связанные с ним функции, которые работают только с экземпляром класса, тогда как в языке C, функция, которая хочет работать со структурой, должна каким-то образом принимать структуру в качестве параметра, обычно с помощью указателя. Следовательно, фрагменту кода Python, который ожидает определенный абстрактный тип данных, можно передать классу, который эмулирует методы этой структуры.
Например, если есть функция, которая форматирует некоторые данные из объекта file
, то можно определить класс с методами read()
и readline()
, которые будут получать данные из строкового буфера и передавать их в качестве аргумента.
Объекты метода экземпляра созданной структуры, также будут имеют атрибуты: m.__self__
— это объект структуры с методом.m()
m.__func__
объект функции, соответствующий методу.Второй вариант объявления структуры данных, подобной языку C — это создание пользовательского типа данных при помощи встроенного модуля dataclasses
, который доступен с версии Python 3.7.
from dataclasses import dataclass @dataclass class Employee(): """Тип данных Employee""" name: str = None dept: str = None salary: int = 0 >>> john = Employee('John Doe', 'computer lab', 1000) >>> john # Employee(name='John Doe', dept='computer lab', salary=1000) >>> john.salary # 1000 >>> john.salary = 1500 >>> john.salary # 1500Третий вариант объявления структуры
— это использовать встроенный модуль ctypes
.
from ctypes import * # Объявляем структуру class Employee(Structure): _fields_ = [ ('name', c_wchar_p), ('dept', c_wchar_p), ('salary', c_int) ] # Инициализируем члены структуры `Employee` >>> john = Employee('John Doe', 'computer lab', 1000) # Доступ к членам структуры `Employee` >>> john.name # 'John Doe' >>> john.salary # 1000 # Изменение членов структуры `Employee` >>> john.salary = 1500 >>> john.salary # 1500
Более подробно о создании структур, совместимые с языком C, смотрите материал «Структуры Structure
и Union
модуля ctypes
в Python»
И четвертый вариант, если конечно согласны на неизменяемую структуру, то это использование именованного кортежа.
Пример:
>>> import collections # Создаем структуру >>> Employee = collections. namedtuple('Employee', ['name', 'dept', 'salary']) # Заполняем члены структуры `Employee` >>> john = Employee('John Doe', 'computer lab', 1000) # смотрим >>> john # Employee(name='John Doe', dept='computer lab', salary=1000) # Доступ к членам структуры `Employee` >>> john.name 'John Doe' >>> john.salary 1000
Структуры в C
«В языке C структуры представляют собой инициализацию комбинированного типа данных, которая используется для группировки нескольких переменных в один тип; сгруппированные переменные должны быть связаны друг с другом. Это позволяет получить доступ к этим переменным с помощью одного указателя. Основное различие между структурой и массивом заключается в том, что массив имеет только один тип данных, но, с другой стороны, структура может содержать разные типы данных. Следовательно, мы можем сказать, что структура — это определяемый пользователем тип данных, который используется для хранения нескольких переменных с разными типами данных в одном блоке для хранения определенного типа или записи.
Предположим, нам нужно сохранить запись человека; этот тип записи будет иметь атрибуты с разными типами данных, такими как число, имя в символе и т. д. Для этой цели мы не можем использовать массив, поскольку он хранит записи с одним и тем же типом данных. Состав нам в этом случае пригодится. Это способ группировать разные типы данных, и его определение означает, что мы создаем новый тип данных».
Синтаксис
Синтаксис объявления Структуры следующий:
На приведенном выше рисунке мы написали фрагмент кода для объявления структуры. Структура — это ключевое слово, которое сообщает системе, что мы инициализируем структуру. После этого мы присвоили нашей структуре имя «Structer_Name». Затем открывающая скобка для объявления наших переменных. В разделе переменных мы объявили переменные разных типов данных, чтобы показать вам, как структура может хранить вместе переменные с разными типами данных. Поэтому переменные включены в структуру. Чтобы закончить наш структурный блок, мы используем точку с запятой в качестве разделителя операторов.
Пример 1
На этом рисунке построена Структура под названием «Сведения об учащемся». В блоке переменных мы объявили несколько переменных, описывающих атрибуты студента. Затем мы взяли три характеристики студента, его имя, номер списка и результат или, в нашем примере, процент. Тип данных номеров рулонов — целое число, потому что обычно номер рулона — это число. Полному имени назначается символ, и, наконец, проценту назначается тип данных Float, потому что мы можем получить процент в десятичных точках.
Следует иметь в виду, что структура не может быть объявлена в основном методе. Его можно вызвать, используя его объект в основном методе. После объявления структуры мы перейдем к нашему основному методу, в котором мы объявим объект нашей структуры. С помощью этого объекта мы можем выполнять операции над переменными.
Detail1 — это имя созданного нами объекта. Для каждого ученика мы определим отдельный объект нашей структуры, такой как Detail2, Detail3 и т. д. С помощью Detail1 мы назвали переменные нашей структуры. Теперь Detail1 создаст запись конкретного студента. Мы присвоили нашему ученику Roll_num=100, а также все остальные атрибуты. Чтобы назначить данные определенной записи, мы будем использовать объект, созданный для этой конкретной записи.
После присвоения всех значений переменной в Instance Detail1 нашей структуры мы отобразим эти записи с помощью функции printf. В функции printf %d обозначает десятичные значения, %s представляет строковые значения, а %f сообщает, что будут отображаться значения с плавающей запятой. Мы напечатали все три атрибута «Студент XYZ».
После запуска программы мы получим вывод нашего кода, написанного выше. Мы присвоили значения конкретному экземпляру нашей структуры и распечатали значения, и, как вы можете видеть на рисунке ниже, система отобразила нам значения этого экземпляра. С этими значениями могут быть выполнены дополнительные процедуры. Вы также можете определить другой экземпляр структуры Student_Details для создания записей о нескольких учениках с разными именами и другими характеристиками.
Пример 2
В следующем примере создается структура, называемая таблицей. У таблицы есть длина и ширина, поэтому мы взяли их в качестве параметров этой структуры. Мы уже объяснили в предыдущем примере, как структура хранит различные типы данных. Но в этом примере мы объясним, как мы можем получить доступ к нескольким экземплярам одной структуры. В теле структуры мы объявили две целочисленные переменные.
Теперь, чтобы вызвать структуру, мы перейдем к нашей основной функции. В основной функции мы определили два целых числа как area1 и area2, которые будут хранить площади table1 и table2 соответственно. Мы создали первый объект нашей таблицы как t1, который будет действовать как table1, и мы объявили второй экземпляр нашей структуры как t2, который будет действовать как table2. Длина таблицы 1 равна пяти, а ширина — трем. Переменная Area1 будет хранить значение, которое мы получим, выполнив операцию умножения наших целых чисел t1. Значения, присвоенные таблице 2, равны 7 и 5. Область 2 будет хранить результат умножения этих значений друг на друга. Наконец, мы распечатали вывод, чтобы получить результаты из кода.
Система выдаст это в качестве вывода. Мы присвоили 5 и 3 нашему экземпляру t1 и с помощью объекта нашей структуры выполнили математическую операцию над нашими данными.
Мы присвоили 7 и 5 нашему объекту t2, и он также дал нам вывод после операции. Итак, понятно, что с помощью одной структуры и двух переменных мы оперировали несколькими объектами. Сначала мы рассчитали площадь Таблицы 1, а затем площадь Таблицы 2. Это пример, показывающий, как работают экземпляры и объекты структуры.
Заключение
В этом руководстве мы обсудили, как структуры реализованы в языке C. Вы можете узнать больше о структурах, используя несколько примеров на основе сценариев. Вы даже можете овладеть им, практикуя примеры с разными случаями. Структуры позволяют нам использовать их экземпляры столько раз, сколько нам нужно, и создавать столько записей, сколько мы хотим. Кроме того, они не только позволяют создавать несколько экземпляров и разных типов данных, но также позволяют выполнять все математические, арифметические и другие операции, связанные с этими типами данных. Это эффективный подход к обработке нескольких записей.
Объявления структуры | Microsoft Learn
- Статья
- 4 минуты на чтение
«Объявление структуры» называет тип и определяет последовательность значений переменных (называемых «членами» или «полями» структуры), которые могут иметь разные типы. Необязательный идентификатор, называемый «тегом», дает имя типа структуры и может использоваться в последующих ссылках на тип структуры. Переменная этого типа структуры содержит всю последовательность, определенную этим типом. Структуры в C подобны типам, известным как «записи» в других языках.
Синтаксис
Struct-Or-Union-специфический Идентификатор
Структура-Ор-Юнион :
Страница
Союз
0068
список-объявлений-структур объявление-структур
объявление-структуры :
список-описателей-описателей 6 описание-структуры описание-0;
Спецификатор-квалификатор :
Тип-специфический список :
Struct-Declarator
Объявление типа структуры не отводит место для структуры. Это всего лишь шаблон для последующих объявлений структурных переменных.
Ранее определенный идентификатор (тег) может использоваться для ссылки на тип структуры, определенный в другом месте. В этом случае struct-declaration-list не может быть повторен, пока определение видимо. Объявления указателей на структуры и определения типов для типов структур могут использовать тег структуры до определения типа структуры. Однако определение структуры должно встречаться до любого фактического использования размера полей. Это неполное определение типа и тега типа. Чтобы это определение было завершено, определение типа должно появиться позже в той же области.
struct-declaration-list указывает типы и имена членов структуры. Аргумент struct-declaration-list содержит одно или несколько объявлений переменных или битовых полей.
Каждая переменная, объявленная в struct-declaration-list , определяется как элемент типа структуры. Объявления переменных в struct-declaration-list имеют ту же форму, что и другие объявления переменных, обсуждаемые в этом разделе, за исключением того, что объявления не могут содержать спецификаторы класса хранения или инициализаторы. Члены структуры могут иметь любые типы переменных, кроме типа 9. 0076 void
, неполный тип или тип функции.
Элемент не может быть объявлен как имеющий тип структуры, в которой он появляется. Однако член может быть объявлен как указатель на тип структуры, в которой он появляется, если у типа структуры есть тег. Это позволяет создавать связанные списки структур.
Структуры имеют ту же область видимости, что и другие идентификаторы. Идентификаторы структур должны отличаться от других тегов структур, объединений и перечислений с такой же видимостью.
Каждое объявление-структуры в списке -объявлений-структур должно быть уникальным в пределах списка. Однако имена идентификаторов в списке-объявлений-структур не обязательно должны отличаться от имен обычных переменных или от идентификаторов в других списках объявлений структур.
Доступ к вложенным структурам также можно получить, как если бы они были объявлены на уровне файловой области. Например, учитывая это объявление:
struct a { интервал х; структура б { инт у; } переменная2; } переменная1;
обе эти декларации допустимы:
struct a var3; структура б var4;
Примеры
Эти примеры иллюстрируют объявления структуры:
struct employee /* Определяет структурную переменную с именем temp */ { имя персонажа[20]; внутренний идентификатор; длинный класс; } темп;
Структура сотрудника
состоит из трех членов: имя
, идентификатор
и класс
. Элемент name
представляет собой массив из 20 элементов, а id
и class
являются простыми членами с типом int
и long
соответственно. Идентификатор сотрудника
является идентификатором структуры.
структура работник студент, преподаватель, персонал;
В этом примере определяются три структурные переменные: студент
, преподаватель
и персонал
. Каждая структура имеет одинаковый список из трех членов. Члены объявляются со структурным типом 9.0093 сотрудник , определенный в предыдущем примере.
struct /* Определяет анонимную структуру и */ { /* структурная переменная с именем комплекс */ плавать х, у; } сложный;
Сложная структура
состоит из двух элементов типа с плавающей запятой
, x
и y
. Тип структуры не имеет тега и поэтому является безымянным или анонимным.
образец структуры /* Определяет структуру с именем x */ { символ с; поплавок *пф; образец структуры *next; } Икс;
Первые два члена структуры — переменная char
и указатель на значение с плавающей запятой
. Третий элемент, next
, объявлен как указатель на определяемый тип структуры ( пример
).
Анонимные структуры могут быть полезны, когда тег named не нужен. Это тот случай, когда одно объявление определяет все экземпляры структуры. Например:
структура { интервал х; инт у; } моя структура;
Встроенные конструкции часто анонимны.
структура { struct /* Анонимная структура */ { интервал х, у; } точка; тип int; } ш;
Специально для Microsoft
Компилятор допускает массив без размера или нулевого размера в качестве последнего члена структуры. Это может быть полезно, если размер константного массива различается при использовании в различных ситуациях. Объявление такой структуры выглядит так:
struct
идентификатор { набор объявлений тип имя-массива []; };
Массивы без размера могут появляться только как последний член структуры. Структуры, содержащие объявления неразмерных массивов, могут быть вложены в другие структуры, если в каких-либо окружающих структурах не объявлены дополнительные члены. Массивы таких структур не допускаются. Оператор sizeof
при применении к переменной этого типа или к самому типу принимает 0 в качестве размера массива.
Объявления структур также можно указывать без декларатора, если они являются членами другой структуры или объединения. Имена полей продвигаются во вмещающую структуру. Например, безымянная структура выглядит так:
struct s { плавать у; структура { в а, б, в; }; символ ул[10]; } *p_s; .