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ć?

prometheuspk
źródło
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ć.
blubb
źródło
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.

Joris Timmermans
źródło
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

maniak zapadkowy
źródło