Чем структура отличается от класса c
Перейти к содержимому

Чем структура отличается от класса c

  • автор:

Структуры и классы (Visual Basic)

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

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

Так как нельзя наследовать от структуры, структуры следует использовать только для объектов, которые не нужно расширять. Используйте структуры, если объект, который требуется создать, имеет небольшой размер экземпляра и учитывает характеристики производительности классов и структур.

Сходства

Структуры и классы похожи в следующих отношениях:

  • Оба типа являются типами контейнеров , что означает, что они содержат другие типы в качестве членов.
  • Оба имеют члены, которые могут включать конструкторы, методы, свойства, поля, константы, перечисления, события и обработчики событий.
  • Члены обоих типов могут иметь индивидуальные уровни доступа. Например, один член можно объявить Public , а другой Private .
  • Оба могут реализовывать интерфейсы.
  • Оба могут иметь общие конструкторы с параметрами или без них.
  • Оба могут предоставлять свойство по умолчанию при условии, что это свойство принимает по крайней мере один параметр.
  • Оба могут объявлять и вызывать события, и оба могут объявлять делегатов.

Различия

Структуры и классы отличаются следующими особенности:

  • Структуры — это типы значений; классы являются ссылочными типами. Переменная типа структуры содержит данные структуры, а не ссылку на данные, как это делает тип класса.
  • Структуры используют выделение стека; классы используют выделение кучи.
  • По умолчанию используются Public все элементы структуры; переменные класса и константы — Private по умолчанию, а другие члены класса — Public по умолчанию. Такое поведение для членов класса обеспечивает совместимость с системой по умолчанию Visual Basic 6.0.
  • Структура должна иметь по крайней мере одну переменную без общего доступа или ненастраиваемый элемент события. класс может быть полностью пустым.
  • Элементы структуры не могут быть объявлены как Protected ; члены класса могут.
  • Структурированная процедура может обрабатывать события только в том случае, если это общая Sub процедура, и только с помощью оператора AddHandler. Любая процедура класса может обрабатывать события с помощью ключевое слово Handles или AddHandler оператора . Дополнительные сведения см. в статье Events (Visual Basic) (События в Visual Basic).
  • Объявления переменных структуры не могут указывать инициализаторы или начальные размеры массивов; объявления переменных класса могут.
  • Структуры неявно наследуют от System.ValueType класса и не могут наследовать от любого другого типа; классы могут наследовать от любого класса или классов, отличных от System.ValueType.
  • Структуры не наследуются; классы имеют значение .
  • Структуры никогда не завершаются, поэтому среда CLR никогда не вызывает Finalize метод для какой-либо структуры. Классы завершаются сборщиком мусора (GC), который вызывает Finalize класс, когда обнаруживает, что активных ссылок не осталось.
  • Для структуры не требуется конструктор; класс делает.
  • Структуры могут иметь общие конструкторы только в том случае, если они принимают параметры; Классы могут иметь их с параметрами или без них.

Каждая структура имеет неявный открытый конструктор без параметров. Этот конструктор инициализирует все элементы данных структуры значениями по умолчанию. Это поведение нельзя переопределить.

Экземпляры и переменные

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

  • Инициализация. Переменная структуры неявно включает инициализацию элементов с помощью конструктора структуры без параметров. Таким образом, Dim s As struct1 эквивалентно Dim s As struct1 = New struct1() .
  • Назначение переменных. При назначении одной переменной структуры другой или передаче экземпляра структуры аргументу процедуры текущие значения всех элементов переменной копируются в новую структуру. При назначении одной объектной переменной другой или передаче объектной переменной процедуре копируется только указатель на ссылку.
  • Назначение ничего. Значение Nothing можно присвоить переменной структуры, но экземпляр по-прежнему связан с переменной. Вы по-прежнему можете вызывать его методы и обращаться к его элементам данных, хотя переменные элементы повторно инициализируются назначением. В отличие от этого, если для объектной переменной Nothing задано значение , вы отмените связь с любым экземпляром класса и не сможете получить доступ к каким-либо членам через переменную, пока ей не назначат другой экземпляр.
  • Несколько экземпляров. Объектная переменная может иметь разные экземпляры класса, назначенные ей в разное время, и несколько объектных переменных могут ссылаться на один и тот же экземпляр класса одновременно. Изменения, внесенные в значения членов класса, влияют на эти члены при доступе через другую переменную, указывающую на тот же экземпляр. Однако элементы структуры изолированы внутри собственного экземпляра. Изменения их значений не отражаются ни в каких других переменных структуры, даже в других экземплярах того же Structure объявления.
  • Равенство. Проверка на равенство двух структур должна выполняться с помощью поэле элементовного теста. С помощью Equals метода можно сравнить две объектные переменные. Equals указывает, указывают ли две переменные на один и тот же экземпляр.

См. также раздел

  • Типы данных
  • Составные типы данных
  • Типы значений и ссылочные типы
  • Структуры
  • Устранение неполадок, связанных с типами данных
  • Структуры и другие элементы программирования
  • Объекты и классы

Совместная работа с нами на GitHub

Источник этого содержимого можно найти на GitHub, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.

Классы и структуры (C++)

В этом разделе приводится информация о классах и структурах C++. В C++ эти конструкции идентичны, за исключением того факта, что структуры по умолчанию открыты для доступа, а классы — закрыты.

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

В этой статье содержатся следующие разделы:

  • class
  • struct
  • Обзор членов класса
  • Контроль доступа к членам
  • Наследование
  • Статические члены
  • Пользовательские преобразования типов
  • Мутируемые элементы данных (описатель с изменяемыми данными)
  • Объявления вложенных классов
  • Типы анонимных классов
  • Указатели на члены
  • Указатель this
  • Битовые поля в C++

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

Дополнительные сведения о профсоюзах см. в разделе «Профсоюзы». Сведения о классах и структурых в C++/CLI и C++/CX см. в разделе «Классы и структуры».

Управление доступом и ограничения для структур, классов и объединений

Структуры Классы Объединения
Ключ класса : struct Ключ класса : class Ключ класса : union
Доступ по умолчанию: public (открытый). Доступ по умолчанию: private (закрытый). Доступ по умолчанию: public (открытый).
Нет ограничений на использование Нет ограничений на использование Используется только один член за один раз

C#: Отличие класса от структуры (class vs struct)

Блог доброго программиста

Сегодня я решил рассказать о одном из частых вопросах на собеседованиях «чем отличается класс от структуры в C#«.

На самом деле ответить на этот вопрос можно очень коротко. Структура в C# является типом передающимся по значению, класс же является ссылочным типом. По большей части сказать больше нечего. Однако данный ответ врятли внесет какую то ясность людям, которые не понимают что значит передавать по ссылке или передавать по значению. Поэтому давайте рассмотрим данный вопрос подробней на примерах. Предположим что у нас есть «class cA» и struct «sA».
Первое важное отличие ссылочного типа от типа передаваемого по значению это то, что значимый тип не может быть равен null.

cA ca = null; //OK sA sa = null; //Error

Так как структура не может быть равна null то она должна быть инициализирована. При этом инициализация структуры происходит по умолчанию нулевыми значениями. В следствие этого вы не можете создать конструктор по умолчанию для структур. А как следствие не можете инициализировать значения переменных в структурах inline.

struct sA < int c = 11; //Error bool b; //Ok int a; //Ok public sA() < >//Error public sA(int a, bool b) < >//Ok > sA sa = new sA(); sA sa2; ///Эквивалентно записи строчкой выше //sa.b == sa2.b == false //sa.a == sa2.a == 0

Но главным различаем данных двух конструкций является их поведение при присваивании. Это повередение очень легко рассмотреть на примере:

sA sa = new sA() < a = 1 >; cA ca = new cA() < a = 2 >; sA sa2 = sa; sa2.a = 5; Console.WriteLine("sa.a=, sa2.a=", sa.a, sa2.a); //sa.a=1, sa2.a=5 cA ca2 = ca; ca2.a = 10; Console.WriteLine("ca.a=, ca2.a=", ca.a, ca2.a); //ca.a=10, ca2.a=10

Данный пример очень наглядно демонстрирует различие между передачей значения по ссылки и по значению. Как видно передача по значению подрузомевает создание новой переменной и копирование в нее всех значений. Что в дальнейшем позволяет работать с двумя различными объектами. Передача же по ссылке подрузомевает создание новой ссылки на уже имеющиеся значения.
Если проводить аналогию, например, с Windows, то передача по значению — это копирование ваших файлов, а передача по ссылке — создание ярлыков.

Чем отличается структура от класса? [закрыт]

Хотите улучшить этот вопрос? Переформулируйте вопрос так, чтобы он был сосредоточен только на одной проблеме.

Закрыт 5 лет назад .
В чем отличие структуры от класса?
Отслеживать
51.6k 202 202 золотых знака 65 65 серебряных знаков 249 249 бронзовых знаков
задан 4 сен 2018 в 12:25
user303264 user303264
В каком языке/технологии? В общем случае оба понятия достаточно широки.
4 сен 2018 в 12:28
@defaultlocale не могли бы вы обяснить на примере c# и c++
– user303264
4 сен 2018 в 12:30
4 сен 2018 в 12:33
Возможный дубликат вопроса: Чем class отличается от struct?
– user218976
4 сен 2018 в 13:06

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

Класс — это данные и методы для работы с этими данными.

Структра схожа с классом, она так же может иметь в себе перечень неких данных и даже методов.

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

Структура (struct) является типом значения. При создании структуры переменная, которой присвоена структура, содержит фактические данные этой структуры. Если структура присваивается новой переменной, все данные копируются. Таким образом, новая переменная и исходная переменная содержат две отдельные копии одинаковых данных. Изменения, внесенные в одну копию, не влияют на другую.

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

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

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