Разлика между клас и структура

Преди да разберем разликата между Class и Struct, трябва да знаем няколко основни понятия, свързани с тях. Без разбиране на понятията е трудно да се разберат разликите между двете.

Какво е клас и обект:

Това са двете важни концепции, свързани с обектно-ориентираното програмиране, и те формират основата за рамкиране на функциите и предаването на данни към други функции. За по-добро разбиране можем да го свържем с пример от реалния живот. Класът може да се разглежда като магазин, а Обект може да бъде всеки от отделните, специфични магазини като хранителни стоки, канцеларски материали, плодове и др. Всички обекти споделят общите свойства на основния клас - магазина - и от своя страна, обектите може да имат свои собствени изключителни свойства като специфичен дизайн, осветление и т.н. Чрез обектите всъщност можем да използваме класа; те образуват инстанциите на клас.

Синтаксис на клас

Class Store

публични струни неща;

публичен струнен дизайн;

Синтаксис на обект

Магазин за хранителни стоки = нов магазин ();

Магазин канцеларски материали = нов магазин ();

Какво е структура?

Структурата включва само данните и затова е полезно при формулирането на отделните изисквания за данни чрез обектите Struct. За разлика от клас, той няма функции. Ето неговия синтаксис:

struct grocery_entrance

char entry_name [50];

int entry_size;

хранителен магазин

Всички магазини могат да използват входа на Struct с индивидуални имена и размери.

Какво е наследство?

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

Сега, когато сме запознати с основните понятия, можем да влезем в действителната разлика между Class и Struct.

Как се различават?

  • Re-използваемост: Тъй като класовете формират основната рамка, те могат да бъдат използвани повторно; Конструкциите обаче са отделни елементи със специфични свойства, така че те не могат да бъдат използвани повторно. Например, класът за хранителни стоки Class може да се използва за всеки тип хранителни магазини, но Struct grocery_entrance е специфичен само за това и няма смисъл да го използвате повторно в други класове.
  • Видимост: Всички функции в клас са публично достъпни за неговите обекти. Например имаме функция, наречена „неща“ под клас „магазин“. Функцията „неща“ е видима за всички нейни обекти, като „хранителен магазин,„ магазин за канцеларски материали “и т.н. За да поясним нещата, можем да кажем, че данните от „grocery_entrance“ не се виждат публично от всички други магазини.
  • Преминаване по справка и преминаване по стойност: Pass by Reference изпраща само функциите на паметта, а не действителните данни към функциите. Това означава, че всеки път, когато стойността се промени, промяната се отразява в съответните функции. Pass by value, от своя страна, просто изпраща стойността на функцията. В този случай промяна на стойността след изпращането й няма да бъде отразена във функцията. Класът използва преминаване чрез справка, а Struct използва пропускна стойност.
  • Наследяването: Класовете могат да бъдат унаследени по-нататък, за да образуват подкласове, но Структурите не могат да използват наследяването. Например, Class Store дава своите функции на подклас „хранителен магазин“. Но „grocery_entrance“ на Struct не може да наследи никаква функция. Можем да кажем, че тук няма понятие като подструктура.
  • Видимост по подразбиране: Всички членове на клас по подразбиране се съхраняват като частни субекти, докато членовете на един клас по подразбиране се държат като публични образувания.
  • Размерът на празен клас и структура: Class използва размер от 1 байт, дори когато е празен, докато Struct никога не използва памет, когато е празна. Това означава, че можем да кажем, че размерът на празна структура е равен на 0 байта.
  • Събиране на боклук: Събирането на боклук е възможно с класовете, тъй като те използват пропуск по референция. Затова е по-лесно да извършите почистването на едно място, където се съхраняват данните. От друга страна, събирането на боклука не е възможно със Struct, тъй като използва преминаване по стойност и данните са разпръснати на различни места.
  • Управление на паметта: Тъй като Class позволява събиране на боклук, управлението на паметта също е ефективно; въпреки това не е толкова ефективно със Структурите.
  • Конструктор: Конструкторът обикновено инициализира класа с определени зададени стойности. Можем да гледаме на това като на нещо, което е инициализирано със стойности. Ако трябва да се създаде нов клас, конструкторът се призовава да разпредели памет за този случай. Дори можем да предадем стойности като аргументи, докато извикваме конструктор. Нека сега стигнем до нашата актуална дискусия. Класовете позволяват конструктори от всякакъв тип, като например с или без аргументи, докато структурите позволяват на конструкторите само с аргументи, т.е. параметризираните конструктори.
  • Destructor: Деструктор се извиква всеки път, когато трябва да изтрием екземпляр от клас. Деструкторът от своя страна изтрива този екземпляр и освобождава паметта. Класът може да използва деструктор, докато структурата не може.
  • Инициализация на променливи за членове: В класове можем директно да инициализираме променливите член; такава инициализация не е възможна със Structs.
  • Създаване на обект: Общият синтаксис за създаване на обекти в класовете е:

Demo obj = new Demo ();

Това означава, че трябва да използваме ключовата дума „new“, докато създаваме обекти от клас. Това не се изисква при създаване на обекти на Structs. Просто погледнете техния синтаксис:

Demo obj;

Работи перфектно дори и без ключовата дума „ново“.

Кога да се използва клас и кога да се използва структура?

Тъй като класовете са по-гъвкави в предаването на данни и функции заедно, можем да се справим с тях, когато използваните обекти са сложни и големи. В нашия пример, Mall може да използва класа "store", за да изрази системата по-добре. Конструкциите обаче са ограничени до по-малки обекти, тъй като те са сравнително по-малко ефективни от класовете. Ето защо, ако проектирате собствен магазин, Structs са по-добрият избор.

Как да преобразуваме структура в клас и Vice Versa?

Може би сте чували термините „boxing“ и „unboxing“ за преобразуване на структура в клас и обратно. Въпреки че това са ефективни процеси, които ни помагат в преобразуването, с тях трябва да се работи внимателно. Тъй като това се отразява пряко на местата на паметта, има огромно влияние върху работата на нашата система. Освен това влияе върху процесите на събиране на боклука и води до цялостна неефективност на системата. Затова използвайте тези конверсии само когато е необходимо.

Нека разгледаме горепосочените разлики в таблична форма.

S.No Концепции Различията
клас Struct
1 Re-използваемост Напълно повторно използваеми Не може да се използва повторно
2 видимост Всички функции на клас са видими за неговите обекти Данните на обект на структура не се виждат от други обекти на същата структура
3 Преминаване по справка и преминаване по стойност Използвайте Pass by Reference Използвайте Pass by Value
4 наследяване Функциите на клас могат да бъдат наследени от неговите подкласове; позволява наследяване Никога не позволява наследяване
5 Видимост по подразбиране Всички членове на клас по подразбиране са частни Всички членове на Структура са по подразбиране публични
6 Размер, когато е празен Размерът на празен клас е 1 байт Размерът на празната структура е 0 байта
7 Събиране на боклук Тъй като се използва пропуск за справка, е възможно събирането на боклука Тъй като използва преминаване по стойност, събирането на боклука не е възможно
8 Управление на паметта Лекотата на процеса на събиране на боклука помага за ефективното управление на паметта Липсата на сметосъбиране води до лошо управление на паметта
9 конструкторите Позволява конструктори от всякакъв тип, като например с или без параметри Разрешава само параметризирани конструктори
10 Деструкторите Може да го използвате Не мога да го използвам
11 Инициализация на променливи на членове Позволява директна инициализация на променливите член Не позволява директна инициализация на думи за променливи член
12 Създаване на обект Задължително е да се използва ключовата дума „ново“ по време на създаването на обекта По желание по време на създаването на обекта се използва ключовата дума „ново“
13 Кога да използвате? По-добре за по-големи и сложни обекти, където се изисква наследяване По-добре за по-малки и по-прости обекти, където наследяването е от по-малко значение.

Почти сме покрили всички разлики между Class и Struct и ако смятате, че нещо липсва, моля, уведомете ни. Нека се научим заедно и да се възползваме максимално от тези знания!