Klasa i struktura

Anonim

Zanim zrozumiemy różnicę między klasą a strukturą, powinniśmy znać kilka podstawowych pojęć z nimi związanych. Bez zrozumienia pojęć trudno jest zrozumieć różnice między nimi.

Co to jest klasa i obiekt:

Są to dwie ważne koncepcje związane z programowaniem obiektowym, które stanowią podstawę do kadrowania funkcji i danych przekazywanych do innych funkcji. Aby lepiej zrozumieć, możemy skorelować to z rzeczywistym przykładem. Klasa może być uważana za sklep, a Przedmiotem może być każdy z indywidualnych, określonych sklepów, takich jak sklep spożywczy, papierniczy, owocowy itp. Wszystkie obiekty mają wspólne właściwości głównej klasy - sklepu - i z kolei obiekty mogą mieć swoje własne ekskluzywne właściwości, takie jak konkretny projekt, oświetlenie itp. Przez obiekty możemy faktycznie używać klasy; tworzą instancje klasy.

Składnia klasy

Class Store {

publiczne ciągi znaków;

publiczny ciąg znaków;

}

Składnia obiektu

Store grocery = new Store ();

Store Stationery = new Store ();

Co to jest Struct?

A Struct zawiera tylko dane, dlatego jest pomocny w określaniu indywidualnych wymagań dotyczących danych za pośrednictwem obiektów Struct. W przeciwieństwie do klasy, brakuje jej funkcji. Oto jego składnia:

struct grocery_entrance {

char nazwa_wpisu [50];

int wejście_wymiar;

} grocery_entrance;

Wszystkie sklepy mogą korzystać z wejścia "Struct" z indywidualnymi nazwami i rozmiarami.

Co to jest dziedziczenie?

Jest podobny do tego, w jaki sposób syn dziedziczy majątek swego ojca, a z kolei syn może również dodać inne jego własne. Klasa może być klasą podstawową lub klasą pochodną, ​​w której ta pierwsza może być podstawą do utworzenia drugiej. Klasa pochodna dodaje do siebie kilka innych właściwości oprócz tego, co pobiera z klasy bazowej. Gdy weźmiemy pod uwagę powyższy przykład, sklep spożywczy nadal może pochodzić z określonego sklepu spożywczego, takiego jak sklep spożywczy XYZ.

Teraz, gdy znamy podstawowe pojęcia, możemy przejść do faktycznej różnicy między klasą a strukturą.

Jak się różnią?

  • Ponowne użycie: Ponieważ klasy tworzą podstawową strukturę, można je ponownie wykorzystać; Struktury są jednak pojedynczymi elementami o określonych właściwościach, więc nie można ich ponownie wykorzystać. Na przykład klasa sklep spożywcza Class może być używana do każdego rodzaju sklepu spożywczego, ale Struct grocery_entrance jest specyficzny dla tego samego i nie ma sensu ponownie go używać w innych klasach.
  • Widoczność: Wszystkie funkcje w klasie są publicznie dostępne dla jego obiektów. Na przykład mamy funkcję o nazwie "rzeczy" w klasie "sklep". Funkcja "rzeczy" jest widoczna dla wszystkich jej obiektów, takich jak "sklep spożywczy", "sklep papierniczy" itp. Taka widoczność nie jest możliwa w przypadku struktur, ponieważ dane struktury są ograniczone do siebie i niewidoczne dla innych struktur. Aby było jasne, możemy powiedzieć, że dane "grocery_entrance" nie są publicznie widoczne dla wszystkich innych sklepów.
  • Przekaż według referencji i podaj wartość: Przekaż przez odniesienie wysyła do funkcji tylko pamięć, a nie rzeczywiste dane. Oznacza to, że za każdym razem, gdy wartość się zmienia, zmiana jest odzwierciedlana w odpowiednich funkcjach. Przekazywanie według wartości, z kolei, po prostu wysyła wartość do funkcji. W takim przypadku zmiana wartości po wysłaniu nie będzie odzwierciedlona w funkcji. Zastosowania klas przechodzą przez referencję, a Struct używa wartości przekazanej.
  • Dziedzictwo: Klasy mogą być dalej dziedziczone w celu utworzenia podklas, ale Structs nie może wykorzystywać dziedziczenia. Na przykład, Class Store udostępnia swoje funkcje podklasowemu "sklepowi spożywczemu". Ale Struct "grocery_entrance" nie może dziedziczyć żadnej funkcji. Można powiedzieć, że nie ma tutaj koncepcji podobnej do pod-struktury.
  • Domyślna widoczność: Wszyscy członkowie klasy są domyślnie trzymani jako podmioty prywatne, podczas gdy członkowie struktury są domyślnie trzymani jako podmioty publiczne.
  • Wielkość pustej klasy i struktury: Klasa używa rozmiaru 1 bajta, nawet gdy jest pusty, natomiast Struct nigdy nie używa żadnej pamięci, gdy jest pusta. Oznacza to, że możemy powiedzieć, że rozmiar pustej struktury wynosi 0 bajtów.
  • Zbieranie śmieci: Wyrzucanie śmieci jest możliwe w przypadku klas, ponieważ używają one przejścia przez odniesienie. Dlatego łatwiej jest przeprowadzić czyszczenie w jednym miejscu, w którym przechowywane są dane. Z drugiej strony, zbieranie śmieci nie jest możliwe w programie Struct, ponieważ używa wartości przekazywanych według wartości, a dane są rozproszone w różnych lokalizacjach.
  • Zarządzanie pamięcią: Ponieważ klasa pozwala na zbieranie śmieci, zarządzanie pamięcią jest również skuteczne; jednak nie jest to tak skuteczne w przypadku Structs.
  • Konstruktor: Konstruktor zazwyczaj inicjuje klasę z pewnymi określonymi wartościami. Możemy patrzeć na to jak na coś, co zostało zainicjowane wartościami. Jeśli konieczne jest utworzenie nowej klasy, konstruktor jest wywoływany w celu przydzielenia pamięci dla tej instancji. Możemy nawet przekazywać wartości jako argumenty podczas wywoływania konstruktora. Przejdźmy teraz do naszej aktualnej dyskusji.Klasy dopuszczają konstruktory wszystkich typów, takie jak z argumentami lub bez, podczas gdy structs dopuszczają konstruktory z argumentami, tj. Sparametryzowanymi konstruktorami.
  • Burzyciel: Destruktor jest wywoływany za każdym razem, gdy musimy usunąć instancję klasy. Z kolei destruktor usuwa tę instancję i zwalnia pamięć. Klasa może używać destruktora, podczas gdy struktura nie może.
  • Inicjalizacja zmiennych użytkownika: W Classes możemy zainicjować zmienne składowe bezpośrednio; taka inicjalizacja nie jest możliwa w Structs.
  • Tworzenie obiektu: Ogólna składnia tworzenia obiektów w klasach to:

Demo obj = new Demo ();

Oznacza to, że musimy używać słowa kluczowego "nowe" podczas tworzenia obiektów klasy. Nie jest to wymagane podczas tworzenia obiektów Structs. Wystarczy spojrzeć na ich składnię:

Demo obj;

Działa doskonale, nawet bez słowa kluczowego "nowy".

Kiedy używać klasy i kiedy używać Struct?

Ponieważ klasy są bardziej elastyczne w przekazywaniu danych i funkcji, możemy je wykorzystać, gdy używane obiekty są złożone i duże. W naszym przykładzie centrum handlowe może używać klasy "sklep" do lepszego wyrażania systemu. Struktury są jednak ograniczone do mniejszych obiektów, ponieważ są one stosunkowo mniej skuteczne niż klasy. Dlatego jeśli projektujesz własny sklep, Struktury są lepszym wyborem.

Jak przekonwertować Struct na klasę i Vice Versa?

Być może słyszeliście terminy "boxing" i "unboxing", aby przekonwertować Struct na klasę i na odwrót. Chociaż są to skuteczne procesy, które pomagają nam w konwersji, powinny być traktowane z ostrożnością. Ponieważ wpływa to bezpośrednio na lokalizacje w pamięci, ma to ogromny wpływ na wydajność naszego systemu. Co więcej, wpływa to na procesy usuwania śmieci i powoduje ogólną nieefektywność systemu. Dlatego używaj tych konwersji tylko w razie potrzeby.

Spójrzmy na wyżej wymienione różnice w formie tabelarycznej.

S. Nie Koncepcje Różnice
Klasa Struct
1 Ponowne użycie Całkowicie wielokrotnego użytku Nie nadaje się do ponownego użycia
2 Widoczność Wszystkie funkcje klasy są widoczne dla jej obiektów Dane obiektu struktury nie są widoczne dla innych obiektów tego samego obiektu Struct
3 Przekaż według referencji i podaj wartość Wykorzystuje Przekazywanie według Odniesienia Używa przekazywania według wartości
4 Dziedzictwo Funkcje klasy mogą być dziedziczone przez jej podklasy; umożliwia dziedziczenie Nigdy nie pozwala na dziedziczenie
5 Domyślna widoczność Wszyscy członkowie klasy są domyślnie prywatni Wszyscy członkowie Struktury są domyślnie publiczni
6 Rozmiar, gdy jest pusty Rozmiar pustej klasy to 1 bajt Rozmiar pustego elementu Struct wynosi 0 bajtów
7 Zbieranie śmieci W miarę używania przejścia według referencji, możliwe jest zbieranie śmieci W miarę używania wartości przesyłaj wartości, zbieranie pamięci nie jest możliwe
8 Zarządzanie pamięcią Łatwość procesu czyszczenia pamięci pomaga w efektywnym zarządzaniu pamięcią Brak zbierania śmieci powoduje złe zarządzanie pamięcią
9 Konstruktorzy Zezwala na konstruktory wszystkich typów, na przykład z parametrami lub bez nich Umożliwia tylko sparametryzowane konstruktory
10 Destruktory Może z niego korzystać Nie można go użyć
11 Inicjalizacja zmiennych użytkownika Umożliwia bezpośrednią inicjalizację zmiennych członkowskich Nie zezwala na bezpośrednią inicjalizację słów zmiennych członkowskich
12 Tworzenie obiektu Konieczne jest użycie słowa kluczowego "nowy" podczas tworzenia obiektu Opcjonalne jest użycie słowa kluczowego "nowe" podczas tworzenia obiektu
13 Kiedy użyć? Lepsze dla większych i złożonych obiektów, gdzie wymagane jest dziedziczenie Lepsze dla mniejszych i prostszych obiektów, w których dziedziczenie ma mniejsze znaczenie.

Omówiliśmy prawie wszystkie różnice między klasami i strukturami, a jeśli uważasz, że czegoś brakuje, daj nam znać. Uczmy się razem i wykorzystajmy tę wiedzę!