Klasa a konstrukcja


12

W C ++ i innych językach, na które ma to wpływ, istnieje konstrukcja o nazwie Structure ( struct), a inna o nazwie class. Oba są zdolne do przechowywania funkcji i zmiennych. Niektóre różnice to:

  1. Klasa otrzymuje pamięć na stercie i structpamięć na stosie (uwaga: jest to złe dla C ++, ale może poprawne w tym, co OP nazwał „językami wpływowymi”)
  2. Zmienne klasy są domyślnie prywatne i structsą publiczne

Moje pytanie brzmi: czy w structjakiś sposób został porzucony dla klasy? Jeśli tak, to dlaczego? Oprócz powyższych różnic, a structmoże robić te same rzeczy, co klasa. Dlaczego więc porzucić?


porzucając, miałem na myśli, dlaczego jedno jest używane nad drugim.
— prometheuspk

myślę, że twoje pytanie sama na to odpowiada.
— Umair A.,

3
Różnica między klasami a strukturami zależy od języka. Niektóre lekcje z C ++ tak naprawdę nie dotyczą C #.
— Job

6
Uhhh W C ++ możesz przydzielać obiekty na stosie lub stosie. Gdziekolwiek chcesz.
— jojo

8
Źle, źle, źle. Stack vs. heap nie ma nic wspólnego z różnicą.
— Aaronaught

Odpowiedzi:


11

W ogóle nie jest opuszczony. W rzeczywistości nawet nowoczesne języki, takie jak C #, które często korzystają z classwciąż oferować struct. Jeśli chodzi o to, kiedy warto wybrać jedną z drugiej, odsyłam do tego artykułu:

Wybieranie między klasami i strukturami

Cytat z artykułu MSDN:

Rozważ zdefiniowanie struktury zamiast klasy, jeśli instancje tego typu są małe i zwykle krótkotrwałe lub są zwykle osadzone w innych obiektach.

Nie definiuj struktury, chyba że typ ma wszystkie następujące cechy:

  • Logicznie reprezentuje pojedynczą wartość, podobną do typów pierwotnych (liczba całkowita, podwójna itd.).
  • Ma rozmiar instancji mniejszy niż 16 bajtów.
  • Jest niezmienny.
  • Nie będzie trzeba go często zapakować.

4
Ta odpowiedź jest naprawdę błędna, ponieważ znaczenie .Net / C # struct / class różni się od C ++ jeden: używają tej samej nazwy, ale mają różne semantyczne w zależności od języka !!! W C ++ prawie nie ma różnicy między strukturą a klasą, a pytanie jest całkowicie błędne w pierwszym punkcie, co jest poprawne w c # i D, ale nie w c ++. Tak więc link do tego artykułu, który dotyczy .Net, naprawdę jest naprawdę błędny. To nie jest C ++!
— Klaim

@Klaim technicznie nie jest odpowiednie dla C # (struktury mogą znajdować się na stosie) Ważnym rozróżnieniem w C # jest semantyka wartości i semantyka odniesienia, różnica, której C ++ nie potrzebuje, ponieważ może mieć wartości lub referencje do czegokolwiek
— jk.

17

Mylisz się co do C ++: jedyną znaczącą różnicą między klasą a strukturą jest domyślna różnica specyfikatora dostępu. Struct i class są dla wszystkich celów i synonimami, uważam, że struct jest przechowywany w celu zapewnienia kompatybilności wstecznej z C.


7
Nie tylko. Struct to dobry wybór, gdy chcesz po prostu zrzucić wiązkę danych do jednego obiektu i nie dodawać do niego żadnego zachowania.
— quant_dev

2
@ quant: To okropny powód do korzystania z struct. Naprawdę mam nadzieję, że ten komentarz był bezczelny.
— Aaronaught

1
@Aaronaught Dlaczego? Mój pogląd na użycie struct jest dość standardowy, zobacz tę odpowiedź na przykład: stackoverflow.com/questions/54585/…
— quant_dev

1
@Aaronaught Jak w takim razie zwracasz wiele wartości? Powiedzmy, model zamówień zwraca czystą cenę, brudną cenę i sumę naliczonych płatności.
— quant_dev

1
@ quant_dev - możesz zdecydować o dołączeniu meta-znaczenia do struktury dla swoich celów (a dla byłych programistów C, które to naprawdę ma sens), ale to nie zmienia faktu, że jedyna różnica między strukturą a słowa kluczowe klasy w C ++ jest domyślnym dostępem.
— Joris Timmermans,

2

język D wprowadził większe rozróżnienie między klasą a strukturą

struct in d to nic innego jak rekord danych przydzielony stosowi z niektórymi funkcjami, które można do niego wywołać (nie ma opcji dziedziczenia, chyba że użyjesz konfiguracji wyliczenia + unii, tj. samodzielnie zaimplementujesz polimorfizm), który jest przekazywany przez wartość

klasa jest taka, jak jesteśmy przyzwyczajeni do: funkcji wirtualnych, alokacji sterty, (pojedynczego) dziedziczenia, przekazywanych przez ref

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.