To pytanie zostało już zadane w kontekście C # / .Net .
Teraz chciałbym poznać różnice między strukturą a klasą w C ++. Omów różnice techniczne, a także powody wyboru jednego lub drugiego projektu OO.
Zacznę od oczywistej różnicy:
- Jeśli nie określisz
public:
lubprivate:
, członkowie struktury są domyślnie publiczni; członkowie klasy są domyślnie prywatni.
Jestem pewien, że istnieją inne różnice w niejasnych rogach specyfikacji C ++.
struct
C i C ++? Zobacz tutaj .struct
oznacza C ++. ;) Ale nie ma powodu, dla którego nie można użyć tegoclass
słowa kluczowego.Odpowiedzi:
Zapominasz trudną drugą różnicę między klasami a strukturami.
Cytuj standard (§ 11.2.2 w C ++ 98 do C ++ 11):
I dla samej kompletności, bardziej znana różnica między klasą a strukturą jest zdefiniowana w (11.2):
Dodatkowa różnica: słowa kluczowego
class
można użyć do zadeklarowania parametrów szablonu, astruct
słowa kluczowego nie można użyć w ten sposób.źródło
class
, public zstruct
i oba określają typ klasy.struct
iclass
polega na tym, że ten ostatni może być użyty zamiasttypename
deklarować parametr szablonu, podczas gdy ten pierwszy nie.:)
Cytując C ++ FAQ ,
źródło
Warto pamiętać o pochodzeniu C ++ i zgodności z C.
C ma struktury, nie ma pojęcia enkapsulacji, więc wszystko jest publiczne.
Bycie publicznym domyślnie jest ogólnie uważane za zły pomysł, gdy przyjmuje się podejście zorientowane obiektowo, więc tworząc formę C, która natywnie sprzyja OOP (możesz robić OO w C, ale to ci nie pomoże), co było pomysł w C ++ (pierwotnie „C z klasami”), domyślnie sensowne jest ustawienie członków jako prywatnych.
Z drugiej strony, gdyby Stroustrup zmienił semantykę
struct
tak, aby jego członkowie byli domyślnie prywatni, to zepsułby kompatybilność (nie jest już tak często prawdą, jak rozbieżne standardy, ale wszystkie prawidłowe programy C były również poprawnymi programami C ++, co miało duży wpływ na zapewnienie C ++ przyczółka).class
Wprowadzono więc nowe słowo kluczowe, które jest dokładnie takie jak struct, ale domyślnie jest prywatne.Gdyby C ++ powstał od zera, bez historii, prawdopodobnie miałby tylko jedno takie słowo kluczowe. Prawdopodobnie nie wywarłoby to również takiego wpływu.
Ogólnie rzecz biorąc, ludzie będą mieli tendencję do korzystania z struct, gdy robią coś takiego, jak struktury są używane w C; członkowie publiczni, brak konstruktora (o ile nie jest on w związku, można mieć konstruktory w strukturach, tak jak w przypadku klas, ale ludzie raczej tego nie robią), brak metod wirtualnych itp. Ponieważ języki są w równym stopniu komunikowane z ludzie czytający kod instruujący maszyny (w przeciwnym razie trzymalibyśmy się kodami asemblera i surowymi maszynami wirtualnymi), warto trzymać się tego.
źródło
struct
pliku*.c
-File i pozwolić innym jednostkom tłumaczeniowym używać go tylko ze wskaźnikiem. Masz więc jeszcze silniejszą enkapsulację, ponieważ inne jednostki tłumaczeniowe nawet nie wiedzą, co jest w środkustruct
.Członkowie klasy są domyślnie prywatni. Członkowie Struct są domyślnie publiczni. Poza tym nie ma innych różnic. Zobacz także to pytanie .
źródło
struct
iclass
zadeklarować klasę z identycznych semantyki (mimo wszystko parse mądry interpretacji ciała Definition).Według Stroustrup w języku programowania C ++ :
Funkcjonalnie nie ma żadnej różnicy poza publiczną / prywatną
źródło
STRUCT jest rodzajem abstrakcyjnego typu danych, który dzieli dany fragment pamięci zgodnie ze specyfikacją struktury. Struktury są szczególnie przydatne w serializacji / deserializacji pliku, ponieważ struktura może być często zapisywana w pliku dosłownie. (tj. Uzyskaj wskaźnik do struktury, użyj makra SIZE, aby obliczyć liczbę bajtów do skopiowania, a następnie przenieś dane do lub z struktury).
Klasy to inny typ abstrakcyjnych typów danych, które próbują zapewnić ukrywanie informacji. Wewnętrznie może istnieć wiele machinacji, metod, zmiennych temp, zmiennych stanu. itp., które wszystkie służą do prezentacji spójnego API dla każdego kodu, który chce użyć klasy.
W efekcie struktury dotyczą danych, klasy dotyczą kodu.
Musisz jednak zrozumieć, że są to jedynie abstrakcje. Zupełnie możliwe jest tworzenie struktur, które wyglądają bardzo podobnie do klas i klas, które wyglądają bardzo podobnie do struktur. W rzeczywistości najwcześniejsze kompilatory C ++ były jedynie prekompilatorami, które tłumaczą kod C ++ na C. Dlatego te abstrakcje są zaletą logicznego myślenia, niekoniecznie atutem dla samego komputera.
Oprócz tego, że każdy z nich jest innym rodzajem abstrakcji, Klasy zapewniają rozwiązania zagadki nazewnictwa kodu C. Ponieważ nie można udostępnić więcej niż jednej funkcji o tej samej nazwie, programiści stosowali wzorzec _ (). np. mathlibextreme_max (). Grupując interfejsy API w klasy, podobne funkcje (tutaj nazywamy je „metodami”) można grupować razem i chronić przed nazywaniem metod w innych klasach. Pozwala to programiście lepiej zorganizować swój kod i zwiększyć jego ponowne użycie. Przynajmniej w teorii.
źródło
struct
słowa kluczowego.struct
deklaruje klasy (w tympublic
/private
/protected
, dziedziczenie itp.).SIZE
makro, o którym mówisz?1) Członkowie klasy są domyślnie prywatni, a członkowie struct są domyślnie publiczni.
Na przykład program 1 nie działa podczas kompilacji, a program 2 działa dobrze.
2) Podczas uzyskiwania struktury z klasy / struktury domyślny specyfikator dostępu dla klasy podstawowej / struktury jest publiczny. Podczas wyprowadzania klasy domyślny specyfikator dostępu jest prywatny.
Na przykład program 3 nie działa podczas kompilacji, a program 4 działa dobrze.
źródło
Jedyną inną różnicą jest domyślne dziedziczenie klas i struktur, które, co nie jest zaskoczeniem, odpowiednio prywatne i publiczne.
źródło
To jest na VS2005.
źródło
_tmain
nie jest standardowym C ++.Nie w specyfikacji, nie. Główną różnicą są oczekiwania programistów, gdy czytają Twój kod za 2 lata. struktury często są uważane za POD. Struktury są również używane w metaprogramowaniu szablonów, gdy definiujesz typ do celów innych niż definiowanie obiektów.
źródło
Należy zauważyć jeszcze jedną rzecz: jeśli zaktualizujesz starszą aplikację, która miała struktury do korzystania z klas, możesz napotkać następujący problem:
Stary kod ma struktury, kod został wyczyszczony i zmieniono je na klasy. Następnie do nowej zaktualizowanej klasy dodano funkcję wirtualną lub dwie.
Gdy funkcje wirtualne są w klasach, wówczas kompilator wewnętrznie doda dodatkowy wskaźnik do danych klasy, aby wskazać funkcje.
Jak to zepsuje stary kod, jeśli w starym kodzie gdzieś struktura została wyczyszczona za pomocą memfill, aby wyczyścić wszystko na zerach, to również zniszczy dodatkowe dane wskaźnika.
źródło
calloc
na korzyśćnew
. Wszystko, co można zrobić, to upewnić się, że wszelkie struktury używane przez część C kodu są w rzeczywistości PODS.Członkowie klasy zdefiniowanej za pomocą słowa kluczowego
class
sąprivate
domyślnie. Członkowie klasy zdefiniowanej za pomocą słów kluczowychstruct
(lubunion
) sąpublic
domyślnie.W przypadku braku specyfikatora dostępu dla klasy bazowej
public
przyjmuje się, gdy klasa pochodna jest zadeklarowana,struct
iprivate
przyjmuje się, gdy klasa jest zadeklarowanaclass
.Możesz zadeklarować,
enum class
ale nieenum struct
.Możesz użyć,
template<class T>
ale nie możesztemplate<struct T>
.Zauważ też, że standard C ++ pozwala na zadeklarowanie typu jako „a”
struct
, a następnie użycie goclass
przy deklarowaniu typu i odwrotnie. Ponadto,std::is_class<Y>::value
jesttrue
dla Y byciastruct
iclass
, ale jestfalse
zaenum class
.źródło
struct
aclass
w C ++ jest różnica między słowami kluczowymi, a nie między typami danych (lub lepsza alternatywa;)std::is_class<Y>::value
obejmuje?Różnica między
class
istruct
jest różnicą między słowami kluczowymi, a nie między typami danych. Te dwaoba określają typ klasy. Różnicą słów kluczowych w tym kontekście jest inny domyślny dostęp:
foo::x
jest publiczny ifoo_base
jest dziedziczony publiczniebar::x
jest prywatny ibar_base
jest dziedziczony prywatnieźródło
Oto dobre wyjaśnienie: http://carcino.gen.nz/tech/cpp/struct_vs_class.php
źródło
To tylko konwencja. Struktury mogą być tworzone do przechowywania prostych danych, ale później ewoluują czas dzięki dodaniu funkcji składowych i konstruktorów. Z drugiej strony niezwykłe jest, aby zobaczyć coś innego niż publiczny: dostęp w strukturze.
źródło
źródło
Inna główna różnica dotyczy szablonów. O ile mi wiadomo, możesz użyć klasy podczas definiowania szablonu, ale NIE struktury.
źródło
struct
nie jest tam dozwolone tylko na podstawie konwencji (lepiej powiedz, że toclass
słowo kluczowe jest używane tutaj w innym znaczeniu, zobacz Używanie „class” lub „typename” dla parametrów szablonu ).struct
. Po prostu spróbuj.struct T{}; template <typename T> void foo() {} foo<T>();
Inne odpowiedzi wspominały o domyślnych ustawieniach prywatnych / publicznych (ale zauważ, że struct to klasa jest strukturą; nie są to dwa różne elementy, tylko dwa sposoby definiowania tego samego elementu).
Warto zwrócić uwagę (zwłaszcza, że pytający prawdopodobnie używa MSVC ++, ponieważ wspomina o „niezarządzanym” C ++), że Visual C ++ narzeka w pewnych okolicznościach, jeśli klasa jest zadeklarowana za pomocą,
class
a następnie zdefiniowana za pomocąstruct
(lub ewentualnie na odwrót ), chociaż standard mówi, że jest to całkowicie legalne.źródło
. W klasach wszyscy członkowie są domyślnie prywatni, ale w strukturze członkowie są domyślnie publiczni.
Nie ma takiego terminu jak konstruktor i destruktor dla struktur, ale kompilator klas tworzy domyślne, jeśli nie podasz.
Rozmiar pustej struktury wynosi 0 bajtów, ponieważ rozmiar pustej klasy to 1 bajt Domyślny typ dostępu do struktury jest publiczny. Strukturę należy zwykle stosować do grupowania danych.
Domyślny typ dostępu do klasy to prywatny, a domyślny tryb dziedziczenia to prywatny. Do grupowania danych i metod, które działają na tych danych, należy użyć klasy.
Krótko mówiąc, konwencja polega na użyciu struktury, gdy celem jest grupowanie danych, i klas, gdy potrzebujemy abstrakcji danych i być może dziedziczenia.
W C ++ struktury i klasy są przekazywane według wartości, chyba że jawnie odznaczone. W innych językach klasy i struktury mogą mieć odrębną semantykę - tj. obiekty (instancje klas) mogą być przekazywane przez odniesienie, a struktury mogą być przekazywane przez wartość. Uwaga: istnieją komentarze związane z tym pytaniem. Zobacz stronę dyskusji, aby dodać do rozmowy.
źródło
g++
. Być może myślisz o optymalizacji pustej bazy, ale dotyczy to również obu.struct
tworzy pełnoprawne klasy w C ++.Choć sugerowane przez inne odpowiedzi, nie jest wyraźnie wymienione - że struktury są kompatybilne z C, w zależności od użycia; klasy nie są.
Oznacza to, że jeśli piszesz nagłówek, który chcesz być kompatybilny z C, nie masz innej opcji niż struct (która w świecie C nie może mieć funkcji, ale może mieć wskaźniki funkcji).
źródło
Możesz wziąć to pod uwagę w celu uzyskania wskazówek, kiedy wybrać strukturę lub klasę, https://msdn.microsoft.com/en-us/library/ms229017%28v=vs.110%29.aspx .
źródło
Klasa ma znaczenie tylko w kontekście inżynierii oprogramowania. W kontekście struktur danych i algorytmów klasa i struktura nie różnią się tak bardzo. Nie ma żadnych ograniczeń, do których należy odwoływać się do członka klasy.
Opracowując duży projekt z mnóstwem ludzi bez klasy, możesz w końcu uzyskać skomplikowany kod, ponieważ wszyscy używają dowolnych funkcji i danych. Klasa zapewnia kontrolę uprawnień i elementy nieodłączne w celu usprawnienia oddzielania i ponownego wykorzystywania kodów.
Jeśli przeczytasz niektóre zasady inżynierii oprogramowania, przekonasz się, że większości standardów nie da się łatwo wdrożyć bez klasy. na przykład: http://en.wikipedia.org/wiki/SOLID_%28object-oriented_design%29
Przy okazji, gdy struct przydziela pęknięcie pamięci i zawiera kilka zmiennych, zmienne typu wartości wskazują, że wartości są osadzone w miejscu, w którym przydzielona jest struktura. W przeciwieństwie do tego, wartości zmiennych typu referencyjnego są zewnętrzne i referencyjne za pomocą wskaźnika, który jest również osadzony w miejscu, w którym jest przydzielony struct.
źródło
struct
deklaruje klasy (w tym kontrolę uprawnień, dziedziczenie itp.).Różnica między słowami kluczowymi struct i class w C ++ polega na tym, że gdy nie ma określonego specyfikatora dla określonego typu danych złożonych, wówczas domyślnie struct lub union są publicznymi słowami kluczowymi, które jedynie rozważają ukrywanie danych, ale klasa jest prywatnym słowem kluczowym, które rozważa ukrywanie programu kody lub dane. Zawsze niektórzy programiści używają struct dla danych i klasy dla samego kodu. Aby uzyskać więcej informacji, skontaktuj się z innymi źródłami.
źródło
struct
członkowie są domyślnie publiczni, a w zaakceptowanej odpowiedzi z 2009 r. Wspomniano o dziedziczeniu. Po co pisać kolejną odpowiedź, która nie dodaje żadnych nowych informacji 4 lata później?Ze wszystkich tych czynników można wywnioskować, że klasa koncepcyjna doskonale nadaje się do przedstawiania obiektów świata rzeczywistego, a nie „struktur”. W dużej mierze dlatego, że koncepcje OOP stosowane w klasie są bardzo praktyczne w wyjaśnianiu scenariuszy ze świata rzeczywistego, dlatego łatwiej je połączyć z rzeczywistością. Na przykład domyślne dziedziczenie jest jawne dla struktur, ale jeśli zastosujemy tę regułę w świecie rzeczywistym, jest to śmieszne, ale w klasie domyślne dziedzictwo jest prywatne, co jest bardziej realistyczne.
W każdym razie, co muszę uzasadnić, to, że Klasa jest znacznie szerszą, stosowaną w świecie rzeczywistym koncepcją, podczas gdy Struktura jest prymitywnym Pojęciem o słabej organizacji wewnętrznej (Eventhough struct podąża za koncepcjami OOP, mają złe znaczenie)
źródło
Główną różnicą między słowem kluczowym struktura i klasa w ups jest to, że w strukturze nie występuje żadna publiczna i prywatna deklaracja członka, a funkcja danych i członek może być zdefiniowana jako publiczna, prywatna i chroniona.
źródło
struct
deklaruje klasy (w tympublic
/private
/protected
, dziedziczenie itp.).** AKTUALIZACJA: ** Proszę zignorować tę odpowiedź. Nie brałem pod uwagę możliwości, że dla struktury wartość była niezainicjowana, ale akurat była równa 0. Nie ma różnicy inicjalizacji między strukturą a klasą.
Widzę inną różnicę między strukturami a klasami związaną z domyślną inicjalizacją.
Uruchom ten kod i sprawdź myTester. Przekonasz się, że dla m_Foo, struct m_Foo.a została zainicjowana na 0, ale dla m_Bar klasa m_Bar.a jest niezainicjowana. Wydaje się więc, że istnieje różnica w tym, co robi domyślny konstruktor dla struktury vs. Widzę to w Visual Studio.
źródło
m_Foo.a
został zainicjowany? Co jeśli nie został zainicjowany i po prostu tak się stało0
?Główną różnicą między struct i klasą jest to, że w struct można deklarować tylko zmienne danych różnych typów danych, podczas gdy w klasie można deklarować zmienne danych, funkcje składowe, a tym samym można manipulować zmiennymi danych za pomocą funkcji.
-> kolejną przydatną rzeczą, którą znajduję w klasie w porównaniu do struktury, jest to, że podczas wdrażania plików w programie, jeśli chcesz wykonywać niektóre operacje struktury w każdym nowym zestawie operacji, potrzebujesz osobnej funkcji i musisz przekazać obiekt struct po odczytaniu go z pliku, aby wykonać na nim pewne operacje. podczas gdy w klasie, jeśli wykonasz funkcję, która za każdym razem wykonuje operacje na danych potrzebnych ... to proste, wystarczy odczytać obiekt z pliku i wywołać funkcję ..
Ale to zależy od programisty, w jaki sposób on / ona uważa za odpowiednie ... według mnie wolę klasę za każdym razem tylko dlatego, że obsługuje OOP i to jest powód, dla którego jest implementowany w prawie wszystkich językach i jest to wspaniała cecha programowania wszech czasów; - )
I tak, najbardziej niezapomnianą różnicą, o której zapomniałem wspomnieć, jest to, że klasa obsługuje ukrywanie danych, a także obsługuje operacje wykonywane na wbudowanych typach danych, a struct nie!
źródło
struct
może mieć funkcjestruct
może mieć konstruktory, funkcję członka i distruktor (ewentualnie wirtualny, ewentualnie prywatny, chroniony lub publiczny). Mogą dziedziczyć i być dziedziczone. więc właściwie ... wszystko, co klasa może mieć. typową konwencją jest deklarowanie za pomocą struct tego, co zadeklarowałbyś jako struct w C, i jako klasy, jeśli deklarujemy zmienną prywatną i chronioną, funkcje wirtualne, ctor i dtor i tak dalej. Ale to tylko konwencja, która nie jest egzekwowana przez językZnalazłem inną różnicę. jeśli nie zdefiniujesz konstruktora w klasie, kompilator go zdefiniuje. ale w strukturze, jeśli nie zdefiniujesz konstruktora, kompilator również nie zdefiniuje konstruktora. więc w niektórych przypadkach, że tak naprawdę nie potrzebujemy konstruktora, struct jest lepszym wyborem (wskazówka dotycząca wydajności). i przepraszam za mój zły angielski.
źródło
struct
słowa kluczowego a klasą zdefiniowaną za pomocąclass
słowa kluczowego.Klasy są typami odniesienia, a struktury są typami wartości.
Kiedy mówię, że Klasy są typami referencyjnymi,
zasadniczo zawierają adres zmiennych instancji.
Na przykład:
W metodzie głównej
mogę utworzyć instancję tej klasy za pomocą nowego operatora, który przydziela pamięć dla tej klasy
i przechowuje jej adres podstawowy w zmiennej typu MyClass (_myClassObject2).
W powyższym programie MyClass _myClassObject2 = _myClassObject1; instrukcja wskazuje, że obie zmienne typu MyClass
i wskaże tę samą lokalizację pamięci.
Zasadniczo przypisuje tę samą lokalizację pamięci do innej zmiennej tego samego typu.
Więc jeśli jakiekolwiek zmiany, które wprowadzimy w jednym z obiektów typu MyClass, będą miały wpływ na inny
ponieważ oba wskazują na tę samą lokalizację pamięci.
„_myClassObject1.DataMember = 10;” w tym wierszu oba elementy danych obiektu będą zawierać wartość 10.
„_myClassObject2.DataMember = 20;” w tym wierszu zarówno element danych obiektu będzie miał wartość 20. W
końcu, uzyskujemy dostęp do członków danych obiektu przez wskaźniki.
W przeciwieństwie do klas, struktury są typami wartości. Na przykład:
W powyższym programie
utworzenie instancji obiektu typu MyStructure przy użyciu nowego operatora i
zapisanie adresu w zmiennej _myStructObject typu MyStructure i
przypisanie wartości 10 członowi danych struktury za pomocą „_myStructObject1.DataMember = 10”.
W następnym wierszu
deklaruję inną zmienną _myStructObject2 typu MyStructure i przypisuję do niej _myStructObject1.
Tutaj kompilator .NET C # tworzy kolejną kopię obiektu _myStructureObject1 i
przypisuje tę lokalizację pamięci do zmiennej MyStructure _myStructObject2.
Zatem wszelkie zmiany, które wprowadzimy w _myStructObject1, nigdy nie będą miały wpływu na inną zmienną _myStructObject2 typu MyStructrue.
Dlatego mówimy, że struktury są typami wartości.
Zatem bezpośrednią klasą podstawową dla klasy jest Object, a bezpośrednią klasą podstawową dla Structure jest ValueType, który dziedziczy z Object.
Klasy będą wspierać dziedziczenie, podczas gdy struktury nie.
Jak to mówimy?
A jaki jest tego powód?
Odpowiedź brzmi: klasy.
Może być abstrakcyjny, zapieczętowany, statyczny i częściowy i nie może być prywatny, chroniony i chroniony wewnętrznie.
źródło
struct
aclass
. Nikt tutaj nie wspomniał o tym ani o całej sieci. Więc nie sądzę, że dotyczy to również C ++.int a = 3; int b = a;
i podobneMyStruct a=MyStruct("data"); MyStruct b = a;
Istnieją 3 podstawowe różnice między strukturą a klasą
Pamięć 1St jest zarezerwowana dla struktury w pamięci stosu (która jest bliska językowi programowania), niezależnie od tego, czy dla klasy w pamięci stosu są zarezerwowane tylko odniesienia, a rzeczywista pamięć jest zarezerwowana w pamięci sterty.
2Nd - Domyślnie struktura traktuje jako publiczną, czy klasa traktuje jako prywatną.
3Rd - nie można ponownie użyć kodu w strukturze, ale w klasie możemy ponownie użyć tego samego kodu w wielu przypadkach zwanych dziedziczeniem
źródło