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

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

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

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

Закрыт 5 лет назад .
В чем отличие структуры от класса?
Отслеживать
51.6k 200 200 золотых знаков 61 61 серебряный знак 242 242 бронзовых знака
задан 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) является типом значения. При создании структуры переменная, которой присвоена структура, содержит фактические данные этой структуры. Если структура присваивается новой переменной, все данные копируются. Таким образом, новая переменная и исходная переменная содержат две отдельные копии одинаковых данных. Изменения, внесенные в одну копию, не влияют на другую.

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

Классы или структуры, в чем отличия

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

Структуры синтаксически очень похожи на классы, но существует принципиальное отличие, которое заключается в том, что класс – является ссылочным типом (reference type), а структуры – значимым типом (value type) (см. статью «Типы данных«). Следовательно, классы всегда создаются в так называемой “куче” (heap), а структуры создаются в стеке (stack).

Но это справедливо в очень простых случаях, главное отличие структур и классов: структуры, указываемые в списке параметров метода, передаются по значению (то есть копируются), объекты классов — по ссылке. Именно это является главным различием в их поведении, а не то, где они хранятся. Примечание: структуру тоже можно передать по ссылке, используя модификаторы out и ref.

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

Так же как и классы, структуры могут иметь поля, методы и конструкторы. О конструкторах структур уже говорилось, ибо это важный критерий при сравнивании классов и структур.

Мы выяснили, что все встроенные типы значений задаются структурами, например, числовые типы int, long, float определены структурами System.Int32, System.Int64 и System.Single соответственно. Эти структуры имеют поля и методы. Мы уже вызывали методы у переменных этих типов. Например, каждая из перечисленных структур имеет метод ToString( ). Также у перечисленных структур есть статичные поля, например, Int32.MaxValue или Int32.MinValue. Получается, что мы уже многократно использовали структуры.

В отличие от классов, использование публичных полей в структурах в большинстве случаев не рекомендуется, потому что не существует способа контролирования значений в них. Например, кто-либо может установить значение минут или секунд более 60. Более правильный вариант в данном случае использовать свойства, а в конструкторе осуществить проверку:

using System; namespace ConsoleApplication1 < struct Time < private int hours, minutes, seconds; public Time(int hh, int mm, int ss) < hours = hh % 24; minutes = mm % 60; seconds = ss % 60; >public int Hours() < return hours; >> class Program < static void Main() < Time t = new Time(30,69,59); Console.WriteLine(t.Hours()); Console.ReadKey(); >> >

В результате будет напечатано число часов: 6 (остаток от деления 30 на 24).
Заменим конструктор Time(…) конструктором без параметров:

public Time()

Получим сообщение об ошибке:
«Структуры не могут содержать явных конструкторов без параметров»

Причина возникновения ошибки в том, что вы не можете использовать конструктор по умолчанию (без параметров) для структуры, потому что компилятор всегда генерирует его сам.

Что же касается класса, то компилятор создает конструктор по умолчанию только в том случае, если Вы его не создали. При объявлении класса нет проблем создать собственный конструктор без параметров (замените в программе ключевое слово struct на class, вы получите результат — 7).

Еще один эксперимент. Замените снова class на struct и удалите полностью конструктор Time(). Запустите программу, она будет выполнена, результат – 0. Вы получите три предупреждения типа:
«Полю «ConsoleApplication1.Time.hours» нигде не присваивается значение, поэтому оно всегда будет иметь значение по умолчанию 0».

Это означает, что был сгенерирован конструктор (без параметров) для структуры, который всегда устанавливает поля в 0, false или null (для объектов) – как и для классов. Поэтому Вы можете быть уверенными в том, что созданная структура всегда будет вести себя адекватно в соответствии со значениями по умолчанию в используемых типах.

Если Вы не хотите использовать значения по умолчанию, то можете инициализировать поля своими значениями в конструкторе с параметрами для инициализации.

Однако если в этом конструкторе не будет инициализировано какое-нибудь значение, компилятор не будет его инициализировать и покажет ошибку.

Два правила структур

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

Второе правило структуры: Нельзя инициализировать переменные в том месте, где они объявляются.

Сравнение классов и структур в сжатом виде:
Вопрос Структура Класс
Какого же типа экземпляр объекта? Значимый (value) тип Ссылочный (reference) тип
Где “живут” экземпляры этих объектов? Экземпляры структуры называют значениями и “живут” они в стеке (stack). Экземпляры классов называют объектами и “живут” они в куче (heap).
Можно ли создать конструктор по умолчанию? Нет Да
Если создается свой конструктор, будет ли компилятор генерировать конструктор по умолчанию? Да Нет
Если в своём конструкторе не будут инициализированы некоторые поля, будут ли они автоматически инициализированы компилятором? Нет Да
Разрешается ли инициализировать переменные там, где их объявляют? Нет ДА

Поля структуры могут быть инициализированы при использовании конструктора (если объект объявляется с помощью оператора new), причем не важно, какого «собственного» или «по умолчанию».

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

using System; namespace ConsoleApplication1 < struct Time < public int hours, minutes, seconds; >class Program < static void Main() < Time t; t.hours=7; Console.WriteLine(t.hours.ToString()); Console.ReadKey(); >> >

В таком случае, переменная t создается, но поля не будут инициализированы конструктором (нет оператора Time t = new Time();). Правда, теперь поля структуры придется объявлять только с модификатором public.

Замечания, над которыми стоит подумать (проверить практикой):

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

2. Дополнения: структуры не могут быть абстрактными, структуры не имеют деструкторов, структуры не поддерживают наследование.

3. Главное отличие структур и классов: структуры передаются по значению (то есть копируются), объекты классов — по ссылке. Именно это является существенным различием в их поведении, а не то, где они хранятся.

4. Структуру тоже можно передать по ссылке, используя модификаторы out и ref.

Примечание. Как получить размер объекта в .Net.
В .Net оператор sizeof(тип) умеет возвращать размеры только простых значимых типов. При попытке направить его на любой управляемый в куче объект вы получите ошибку. Единственный более-менее достоверный способ узнать объем памяти, занимаемый объектом, это сравнение размеров используемой памяти до инициализации объекта-массива и после, например:

long mem = GC.GetTotalMemory(true); int[] intArray = new int[100000]; mem = GC.GetTotalMemory(true) - mem; // В mem - размер объекта в байтах: 4 х 100000 + 16 (?).

Ответ: 400016 байт. Конец примечания.

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

NEW: Наш Чат, в котором вы можете обсудить любые вопросы, идеи, поделиться опытом или связаться с администраторами.

В чем отличия классов и структур?

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

94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:

Подскажите начинающему программисту, в чем отличие структур от классов в C++
Расскажите пожалуйста начинающему программисту, в чем отличие структур от классов в C++

C++ Отличия структур от массивов
Объясните, пожалуйста, в чем заключаются отличия массивов от структур?

Напишите отличия классов от объектов
может кто простым языком рассказать про отличие между классами и объектами

В чем отличия C++ и C#
До этого учил С++, сейчас учу С#.Прочитал около 120 страниц книги Шилдт Г. Полное руководство С#4.0.

48 / 48 / 11
Регистрация: 12.03.2012
Сообщений: 108

по типу дефолтного доступа.
класс, объявленный как class, имеет по умолчанию доступ private.
класс, объявленный как struct, имеет по умолчанию доступ public.
как следствие, наследуя структуру от класса, не обязательно указывать слово public

Добавлено через 1 минуту
Нужно отталкиваться от инкапсуляции. Например, конструктор в структуре полезен довольно часто, хотя, быть может, поля открыты и методы-аксессоры отсутствуют. А если, например, нужно гарантировать, что переменная через интерфейс должна быть только для чтения, поле нужно закрыть и написать соответствующий get — это уже намекает на класс.

Сравнение классов и структур в C++

Структуры необходимо использовать в тех случаях, когда сокрытие данных неуместно.
В качестве иллюстрации, представим абстрактный тип данных для комплексных чисел с помощью структуры и с помощью класса. Единственное отличие — в использовании ключевых слов: private и public .
С использованием структуры:

1
2
3
4
5
6
7
8
9
10
11
12
13

struct complex
void assign( double r, double i);
void print() < cout
private :
double real;
double imag;
>;
void complex::assign( double r, double i = 0.0)
real = r;
imag = i;
>

С использованием класса:

1
2
3
4
5
6
7
8
9
10
11
12
13

class complex
double real;
double imag;
public :
void assign( double r, double i);
void print() < cout
>;
void complex::assign( double r, double i = 0.0)
real = r;
imag = i;
>

Чаще всего структуры содержат только поля и не содержат методов.
Если предполагается создание объектов, для которых будут реализованы методы их использования, то целесообразно использовать класс.

Комментариев к записи: 6

Вопрос по структурам:
Структуры можно наследовать как классы?
Елена Вставская
Вопрос по структурам:
Чем еще структуры отличаются от классов? Статья не полная.
Структуры можно наследовать. Попробуйте:

Добрый день. У меня возник вопрос. Нет ли у вас на этом опечатки либо ошибки? struct s ; Хотя такое определение класса и справедливо, базовым в языке С++ является понятие класса. В С++ принято считать, что структура struct – это просто класс, все члены которого общие, то есть struct s ; // тут разве не public должно быть ? есть просто сокращенная запись// Такой вопрос. class s ; Структуры необходимо использовать в тех случаях, когда сокрытие данных неуместно. В качестве иллюстрации, представим абстрактный тип данных для комплексных чисел с помощью структуры и с помощью класса. Единственное отличие — в использовании ключевых слов: private и public.

Елена Вставская
Согласна, исправила.

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

Рубрики

  • Представление данных и архитектура ЭВМ
  • Создание Windows-приложений
  • Язык Си
  • Язык C++
  • Язык ассемблера
  • Структуры данных
  • Алгоритмизация
  • Алгоритмы сортировки и поиска
  • Задачи и их решение
  • Программирование микроконтроллеров

Реклама

Свежие записи

  • Односвязный линейный список на базе классов ООП 14.12.2018
  • UML-диаграммы классов 17.10.2017
  • Пользовательский сигнал 28.06.2017
  • Цифро-аналоговый преобразователь 19.06.2017
  • Граф 19.05.2017

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

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