Структуры и классы в C ++
C ++ продолжает оставаться языком меньшинства для встраиваемой разработки, но обычно принимается разработчиками, когда проекты становятся слишком большими для эффективного использования C. Эти разработчики обычно переходят с C на C ++, и тонкие различия между языками составляют значительную часть их кривой обучения. В C ++ есть структуры, как и в C, но они не совпадают. В C ++ есть классы, которые очень похожи на структуры. В этой статье подробно рассматриваются эти языковые элементы.
Структуры в C
Структура в C - это настраиваемый составной элемент данных (объект), который может быть построен из существующих встроенных типов данных ( int , символ и т. д.), битовые поля (целые числа указанного размера в битах) и другие структуры. Идея состоит в том, чтобы агрегировать несколько элементов данных, которые принадлежат друг другу. Например, структура для хранения трехмерных координат может выглядеть следующим образом:
координаты структуры {float x; float y; float z;};
Этот код сообщает компилятору, какие координаты структуры похоже. Затем вы можете объявить переменные этого типа следующим образом:
расположение координат структуры;
Переменная местоположение имеет тип структурные координаты и его внутренние поля могут быть адресованы с помощью оператора «точка»:
location.x =1.0; location.y =2.0; location.z =9.99;
Конечно, аналогичного эффекта можно было бы добиться, используя три отдельных поплавка переменные с именами типа location_x и т. д. Однако с местоположением справиться гораздо проще. как единую переменную, которую можно передавать функциям и т. д.
Возможность включения битовых полей дает структурам возможность, недоступную где-либо еще в C. Вот пример:
struct bitreg {без знака:3; без знака вниз:3; беззнаковая полярность:2;};
Каждое из полей в переменной типа struct bitreg имеет определенный размер в битах. Компилятор обеспечивает разумное хранение данных, поэтому мы ожидаем, что такая переменная уместится в один байт. Более того, весь «битовый» код для доступа к полям внутри байта генерируется автоматически. Итак, программист может просто получить к ним доступ следующим образом:
struct bitreg control; control.up =1; control.down =2; control.polarity =3;
По большей части использование структур в C довольно просто и упрощает понимание кода, не влияя на эффективность выполнения. Однако есть два момента, о которых следует знать разработчикам встраиваемых систем:
- Современные высокопроизводительные (обычно 32-разрядные) процессоры имеют наборы команд, которые легко адаптируются к использованию структур. В самом деле, они были созданы именно для этого. Однако большинство процессоров начального уровня не обладают такой эффективностью, поэтому использование структур требует осторожности.
- Битовые поля - полезная функция, которая позволяет создавать эффективный и читаемый код. Разработчики встроенных систем могут сразу же обнаружить возможность:использовать битовые поля для доступа к регистрам управления устройством. Многие периферийные устройства имеют регистры размером 1 слово или 1 байт, которые содержат различные битовые поля. Это похоже на отличное совпадение, и иногда его можно заставить работать. Но есть две проблемы:
- Точная структура битовых полей определяется компилятором. Если все правильно отображается на устройстве, код может работать нормально. Однако смена компилятора или даже просто обновление компилятора может нарушить код.
- Код, сгенерированный компилятором для доступа к битовым полям, скорее всего, будет использовать несколько операций И / ИЛИ и множественный доступ к регистру, что может быть проблематичным. Более того, некоторые регистры устройств предназначены только для записи и никогда не будут включены в код, созданный компилятором.
Хотя структура C выглядит как новый тип данных, на самом деле это не так. Тип данных обычно имеет ряд операций, которые могут быть выполнены с ним; это не относится к структуре C. Чтобы сделать что-либо со структурой C, кроме создания указателя на нее, вам необходимо получить доступ к внутренним полям. Этот вопрос решается на C ++.
Классы C ++
Язык C ++ имеет ряд объектно-ориентированных возможностей. Одним из них является концепция класса . , что позволяет описывать что-то более похожее на новый тип данных. Переменная (обычно называется объектом ) может быть создан из класса; т.е. это объект этого нового типа.
Класс C ++ имеет почти тот же синтаксис, что и структура C, и некоторые очень похожие возможности. Однако есть несколько важных отличий:
- Класс также может содержать функции (называемые методами ).
- Переменные-члены и методы скрыты от внешнего мира, если их объявление не следует за общедоступным:
- Может быть пара специальных методов - конструктор и деструктор - которые запускаются автоматически при создании и уничтожении экземпляра класса (объекта) соответственно.
- Операторы для работы с новым типом данных могут быть определены с помощью специальных методов (функций-членов).
- Один класс может использоваться в качестве основы для определения другого (это называется наследованием ).
- Для объявления переменной нового типа (экземпляра класса; объекта) требуется только имя класса - ключевое слово class не требуется.
Большинство из этих функций проиллюстрировано в этом примере:
класс myclass {char a; int b; общедоступные:void fun (); мои занятия(); ~ myclass ();}; myclass myobj; myobj.fun ();
Переменные-члены a и b доступны только для трех функций-членов fun () , myclass () и ~ myclass () . Последние две функции - это конструктор и деструктор. Только веселье () скорее всего будет вызван кодом пользователя. Фактический код для всех трех функций будет определен в другом месте, связанном с классом с помощью :: оператор, таким образом:
void myclass ::fun () {...
Структуры в C ++
В дополнение к классам в C ++ есть структуры, обратно совместимые с C. Однако структура C ++ также имеет те же дополнительные возможности, которыми обладают классы. Это всего лишь одно различие между структурой и классом в C ++. Как мы видели, доступность по умолчанию для переменных-членов и функций в классе является частной; по умолчанию структура является общедоступной. Таким образом, функциональность более раннего класса также может быть выражена следующим образом:
struct mystruct {void fun (); мои занятия(); ~ myclass (); частный:char a; int b;};
Использование классов и структур в C ++
Получив эту информацию, вам настоятельно рекомендуется не использовать ее слишком активно. Есть много причин для использования структур только для той функциональности, которую они предлагают в C, и классов, когда вам нужны дополнительные возможности. В первую очередь, это вопрос читабельности кода. Другой разработчик может быть не так ясен в деталях, и код, написанный «нестандартным» способом, будет сбивать с толку.
Ключевым приоритетом при написании кода является обеспечение его читабельности (=поддерживаемости). Кто-то - это может быть вы - может через год взглянуть на этот код и понять, что он делает. Несколько советов:предположите, что человек, который будет поддерживать ваш код, является вооруженным психопатом, который имеет ограниченное терпение и знает ваш домашний адрес.
Встроенный
- Переменные C++, литералы и константы
- Классы и объекты С++
- Управление памятью C++:создание и удаление
- Публичное, защищенное и частное наследование C++
- Семафоры:служебные службы и структуры данных
- Группы флагов событий:служебные службы и структуры данных
- Java — объект и классы
- Классы хранения в C++
- Дата и время С++
- Структуры данных С++