Kiedy należy używać klasy
struct
? Obecnie używam klas dla wszystkiego, od wrapperów tekstur OpenGL do czcionek bitmapowych.C++: Kiedy należy używać struktur zamiast klas i gdzie są różnice prędkości?Czy klasa, której używam, podobnie jak
struct
(bez korzystania z dziedziczenia, polimorfizmu itp.) Jest nadal wolniejsza niżstruct
?
Odpowiedz
1) Nie ma prawdziwej różnicy między 2 innymi niż fakt, że członkowie struktury są domyślnie publiczne, gdy klasy są prywatne.
2) Brak dokładnie tego samego.
Edycja: pamiętaj, że możesz używać dziedziczenia wirtualnego przy użyciu struktur. Są to, że identyczne :)
Dzięki za dokładną odpowiedź. To naprawdę mi pomogło! –
Możesz nawet zadeklarować klasę ze słowem kluczowym class i zdefiniować ją przy użyciu struct i vice versa :) –
@Armen: Ostrzega cię przed zrobieniem tego. Zawsze upewnij się, że masz 0 ostrzeżeń! ;) – Goz
elemencie i klas w C++, jak może wiesz różnią się wyłącznie na podstawie domyślnego poziomu dostępu (i domyślne dostępności swoich podstawach: Ogólnodostępny dla struktury, prywatnych dla klasy).
Niektórzy programiści, w tym ja, wolą używać struktur dla POD-types, to znaczy, ze strukturami w stylu C, bez żadnych funkcji wirtualnych, baz itp. Struktury nie powinny mieć zachowania - są po prostu połączeniem danych umieszczonych w jednym obiekcie .
Ale to oczywiście kwestia stylu i oczywiście nie jest wolniejszy
Dla wyjaśnienia: "typ POD" oznacza "zwykłe stare dane" i odnosi się do struktury lub klasy, która jest w zasadzie taka sama jak struktura C w warunki wykonania. Więcej informacji można znaleźć na stronie http://www.fnal.gov/docs/working-groups/fpcltf/Pkg/ISOcxx/doc/POD.html. I jak zauważa Armen, możesz zadeklarować typy POD jako klasę lub strukturę bez żadnej różnicy wydajności; to po prostu styl. –
Pedant zauważy, że 'class' może być również użyty zamiast' typename' do zadeklarowania parametru szablonu, natomiast 'struct' nie może. Ale to tylko syntaktyczny dzióbek bez prawdziwego znaczenia dla tego pytania. ':)' Dobra odpowiedź, '+ 1' ode mnie. – sbi
@sbi: Zabawne jest to, że rozważałem napisanie o tej syntaktycznej "różnicy", ale pomyślałem, że byłoby zbyt pedantycznie ... Nigdy nie wiesz, jaka reakcja by to spowodowało :)) –
jak inni wyjaśnił, że są to samo z wyjątkiem domyślnego poziomu dostępu.
jedyny powód dlaczego klasy mogą być postrzegane jako wolniejsze, ponieważ jest to dobry styl (ale nie jedynym) jest jednym wspomniał ArmenTsirunyan: struct
dla typów POD, class
dla pełnoprawni klas obiektów. Te ostatnie zwykle obejmują dziedziczenie i metody wirtualne, stąd vtables, które są nieco wolniejsze w wywoływaniu niż funkcje proste.
Zamiast taniej i odnosząc się do innych pytań, powtórzę to, co powiedzieli inni, zanim dodam do nich.
struct
i class
są identyczne w C++, jedynym wyjątkiem jest, że struct
ma domyślnego dostępu public
i class
ma domyślnego dostępu prywatne. Obsługa wydajności i obsługi języków jest identyczna.
Idiomatycznie, jednak, struct
jest używany głównie w klasach "głupich" (zwykłe stare dane). class
służy bardziej do wcielenia prawdziwej klasy.
Ponadto, ja również wykorzystywane struct
lokalnie zdefiniowanych obiektów funkcji, takich jak:
struct something
{
something() : count(0) { }
void operator()(int value) { std::cout << value << "-" << count++ << "\n"; }
int count;
} doSomething;
std::vector<int> values;
...
std::foreach(values.begin(); values.end(); doSomething);
Uwielbiam ten przykład, ponieważ jest to coś, czego jeszcze nie spotkałem w żadnej elementarnej klasie C++ (educational = D no pun przeznaczony). – g19fanatic
@ g19fanatic: Prawdopodobnie czekają na lambdas. Lub "lokalnie zdefiniowana funkcja - dlaczego miałbym chcieć * tego */SticksTongueOut"? –
Lubię używać klas kiedy muszę mieć wyraźny destruktora. Ponieważ wtedy powinieneś przestrzegać zasady trzech, w takim przypadku musisz napisać konstruktora kopii i przeciążenie przypisania. Przy tym wszystkim bardziej naturalne wydaje się użycie klasy niż struktury.
- 1. Kiedy i jak należy używać klas wyliczeniowych zamiast wyliczania?
- 2. W Objective-C, kiedy należy używać metod klas i kiedy należy używać metod instancji?
- 3. Kiedy należy używać setUpClass i kiedy __init__?
- 4. Kiedy należy używać tabeli HashTable zamiast HashMap
- 5. Kiedy należy używać NSURL zamiast NSString i na odwrót?
- 6. Kiedy należy używać ViewData zamiast ViewModels?
- 7. Kiedy należy używać funkcji UserControl zamiast strony?
- 8. Kiedy należy używać HStoreField zamiast JSONField?
- 9. Kiedy należy używać JCR i kiedy należy używać JPA/RDBMS?
- 10. Kiedy należy używać UIImagePickerControllerSourceTypePhotoLibrary zamiast UIImagePickerControllerSourceTypeSavedPhotosAlbum?
- 11. Kiedy należy używać ciągów zamiast ciągów?
- 12. Kiedy należy używać posix_memalign zamiast malloc?
- 13. Kiedy należy używać szablonów zamiast dziedziczenia i na odwrót?
- 14. Kiedy należy używać AQL?
- 15. Kiedy należy używać _aligned_malloc()?
- 16. Kiedy należy używać plików XSD?
- 17. Kiedy należy używać ConcurrentSkipListMap?
- 18. Kiedy należy używać WS_EX_NOREDIRECTIONBITMAP?
- 19. Kiedy należy używać jednolitej inicjalizacji?
- 20. Kiedy należy używać INNER -LOOP- JOIN zamiast INNER JOIN
- 21. Kiedy i gdzie należy użyć WCF
- 22. Kiedy należy używać atrybutu KnownType?
- 23. Kiedy należy używać klasy FrameworkPropertyMetadata lub UIPropertyMetadata zamiast zwykłego PropertyMetadata?
- 24. Kiedy należy używać BOOL i bool w C++?
- 25. Kiedy należy używać wektora obiektów zamiast wektora wskaźników?
- 26. W języku Java, kiedy należy używać "Object o" zamiast generycznych?
- 27. Kiedy należy używać git skrytki?
- 28. Kiedy należy używać niejawnego przesyłania?
- 29. Kiedy należy używać perror ("...") i fprintf (stderr, "...")?
- 30. Kiedy należy używać ConcurrentDictionary i Dictionary?
Na SO istnieje wiele innych bardzo podobnych pytań. – luke
I żaden z nich nie dotyczy efektywności, prawda? –
@Armen: nie, po prostu mówią * są dokładnie takie same *. Wówczas to ćwiczenie jest dla czytelnika dokonaniem skoku dedukcji, że * jeśli są dokładnie takie same *, to * są prawdopodobnie równie skuteczne *. – jalf