2010-11-03 7 views
21
+2

Na SO istnieje wiele innych bardzo podobnych pytań. – luke

+0

I żaden z nich nie dotyczy efektywności, prawda? –

+3

@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

Odpowiedz

14

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 :)

+0

Dzięki za dokładną odpowiedź. To naprawdę mi pomogło! –

+0

Możesz nawet zadeklarować klasę ze słowem kluczowym class i zdefiniować ją przy użyciu struct i vice versa :) –

+0

@Armen: Ostrzega cię przed zrobieniem tego. Zawsze upewnij się, że masz 0 ostrzeżeń! ;) – Goz

34

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

+6

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. –

+1

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

+2

@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 :)) –

1

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.

6

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); 
+0

Uwielbiam ten przykład, ponieważ jest to coś, czego jeszcze nie spotkałem w żadnej elementarnej klasie C++ (educational = D no pun przeznaczony). – g19fanatic

+0

@ g19fanatic: Prawdopodobnie czekają na lambdas. Lub "lokalnie zdefiniowana funkcja - dlaczego miałbym chcieć * tego */SticksTongueOut"? –

1

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.

Powiązane problemy