Po skończeniu mojej klasy C ++ wydawało mi się, że struktury / klasy są praktycznie identyczne, z wyjątkiem kilku drobnych różnic.
Nigdy wcześniej nie programowałem w C; ale wiem, że ma struktury. Czy w C można dziedziczyć inne struktury i ustawić modyfikator public / private?
Jeśli możesz to zrobić w zwykłym C, dlaczego na świecie potrzebujemy C ++? Co sprawia, że klasy różnią się od struktury?
Odpowiedzi:
W C ++ struktury i klasy są prawie takie same; jedyną różnicą jest to, że tam, gdzie modyfikatory dostępu (dla zmiennych składowych, metod i klas bazowych) w klasach są domyślnie prywatne, modyfikatory dostępu w strukturach domyślnie mają wartość public.
Jednak w C struktura jest po prostu zbiorczym zbiorem (publicznych) danych i nie ma innych cech klasowych: żadnych metod, konstruktora, klas bazowych itp. Chociaż C ++ odziedziczył słowo kluczowe, rozszerzył semantykę. (To jest jednak powód, dla którego w strukturach domyślnie rzeczy są publiczne - struktura napisana jak struktura w C zachowuje się jak jedna).
Chociaż możliwe jest sfałszowanie niektórych OOP w C - na przykład definiowanie funkcji, które wszystkie przyjmują wskaźnik do struktury jako pierwszy parametr lub czasami wymuszanie przekształcenia struktur z tymi samymi pierwszymi polami jako „podklasy / nadklasy” - zawsze przykręcone i tak naprawdę nie jest częścią języka.
źródło
Poza tym różnice w dostępie domyślnym (publiczny / prywatny), nie ma różnicy.
Jednak niektóre sklepy, które kodują w C i C ++, będą używać „class / struct” do wskazania tego, co może być używane w C i C ++ (struct), a które są tylko w C ++ (class). Innymi słowy, w tym stylu wszystkie struktury muszą współpracować z C i C ++. Dlatego właśnie dawno temu istniała różnica, kiedy C ++ było jeszcze znane jako „C z klasami”.
Zwróć uwagę, że związki C działają z C ++, ale nie na odwrót. Na przykład
I podobnie
działa tylko w C
źródło
Zamierzam dodać do istniejących odpowiedzi, ponieważ nowoczesny C ++ jest teraz czymś, a oficjalne podstawowe wytyczne zostały stworzone, aby pomóc w takich pytaniach.
Oto odpowiednia sekcja z wytycznych:
Podane przykłady kodu:
Class
e działają dobrze w przypadku członków, którzy są na przykład pochodzący od siebie nawzajem lub ze sobą powiązani. Mogą również pomóc w sprawdzaniu poprawności podczas tworzenia instancji.Struct
dobrze sprawdzają się w przypadku posiadania „worków danych”, w których tak naprawdę nic specjalnego się nie dzieje, ale logicznie rzecz biorąc, grupy członków mają sens.Z tego wynika, że
class
istnieją es do obsługi hermetyzacji i innych pokrewnych koncepcji kodowania, do którychstruct
po prostu nie są zbyt przydatne.źródło
struct
s są najbardziej przenośne. Mogą być używane przez C lub C ++ albo tam iz powrotem. Można je również rozpakowaćstruct
na przykład w Pythonie za pomocą modułu. Jeśli twoje priorytety projekt jest zgodny z innych języków, interfejsów lub systemów, woląstruct
sięclass
. Preferuj sprawy ściśle programoweclass
.Nie można definiować funkcji składowych ani wyprowadzać struktur od siebie w C.
Ponadto C ++ to nie tylko C + „struktury pochodne”. Szablony, odwołania, przestrzenie nazw zdefiniowane przez użytkownika i przeciążenie operatorów nie istnieją w C.
źródło
power
struktur w C. Czyli C ++ używa struktur tylko do „wstecznie” kompatybilności z C?struct
mam na myśli w dużej mierze pasywny typ POD.std::less
) jest definiowanych jako struktury, a nie klasy.Jeszcze jedna różnica w C ++, kiedy dziedziczysz klasę ze struktury bez żadnego specyfikatora dostępu, staje się ona dziedziczeniem publicznym, podczas gdy w przypadku klasy jest to dziedziczenie prywatne.
źródło
C ++ używa struktur głównie do 1) wstecznej zgodności z typami C i 2) POD. Struktury C nie mają metod, dziedziczenia ani widoczności.
źródło
std::less
) Jest definiowanych jako struktury, a nie klasy.