Erevis Δημοσ. 23 Αυγούστου 2010 Δημοσ. 23 Αυγούστου 2010 Η διαφορά που έχουν τα C structs από τις κλάσεις είναι πως οι κλάσεις εκτός από δεδομένα ενθυλακώνουν και συμπεριφορά. Επίσης συμβάλλουν σε αντικειμενοστρεφείς έννοιες όπως η κληρονομικότητα και ο πολυμορφισμός. Τα C++ structs δεν έχουν καμιά διαφορά εκτός του ότι το default acess specifier τους είναι public ενώ στις κλάσεις private. Βέβαια αν τα μέλη που διαθέτει είναι όλα POD(Plain-old datatypes) όπως ints, floats , booleans τότε και η δομή θεωρείται POD, άρα δε χρειάζεται constructor, copy constructor, destructor και assignment operator.
dop Δημοσ. 25 Αυγούστου 2010 Δημοσ. 25 Αυγούστου 2010 Βέβαια αν τα μέλη που διαθέτει είναι όλα POD(Plain-old datatypes) όπως ints, floats , booleans τότε και η δομή θεωρείται POD, άρα δε χρειάζεται constructor, copy constructor, destructor και assignment operator. Αυτά δεν έχουν καμία σχέση με το POD. Άμα δεν δηλώσεις constructors, destructor και assignment operator, ο compiler θα σου δώσει από μόνος του.
Erevis Δημοσ. 26 Αυγούστου 2010 Δημοσ. 26 Αυγούστου 2010 Aν τα μέλη ενός struct ή μιας class είναι όλα PUBLIC και POD (union, enum, int, float, bool ) θεωρούνται κι αυτά PODs και ούτε ο compiler φτιάχνει implicitly constructors, destructors, assingment operators.
dop Δημοσ. 26 Αυγούστου 2010 Δημοσ. 26 Αυγούστου 2010 Και πάλι, το γεγονός ότι ο compiler θα φτιάξει για σένα constructor, destructor και assignment operator δεν έχει καμία σχέση με το αν είναι POD ή όχι - θα σου τα φτιάξει για οποιαδήποτε κλάση άμα δεν τα δηλώσεις. Ειδικότερα για τις POD κλάσεις, θα σου δώσει default constructor που κάνει zero initialize όλα τα member variables, copy constructor και assignment operator που κάνουν memcpy και destructor που είναι άδειος.
Erevis Δημοσ. 26 Αυγούστου 2010 Δημοσ. 26 Αυγούστου 2010 Δοκίμασα αυτό: > #include <cstdlib> #include <iostream> struct A { int x; float y; }; int main() { A ar[10]; for(int i = 0; i < 10; ++i) { td::cout << ar[i].x << " " << ar[i].y << std::endl; } return 0; } output: > 134514748 1.4013e-45 65535 1.4013e-45 -1216076132 -1.57401e-05 -1217367260 -1.25154 134514909 -1.32066e-05 134520820 -1.25154 134514148 0 134520820 1.4013e-45 134514801 0 -1218604202 -1.43319e-05 Τελευταία έκδοση του g++, δε βλέπω να κάνει initialize στο 0 τίποτα.
dop Δημοσ. 26 Αυγούστου 2010 Δημοσ. 26 Αυγούστου 2010 > #include <iostream> #include <algorithm> #include <iterator> struct A { int x; float y; }; int main() { char c[sizeof(A)]; std::fill(c, c+sizeof(A), 42); std::copy(c, c+sizeof(A), std::ostream_iterator<int>(std::cout, " ")); std::cout << std::endl; A* a = new(c) A(); std::cout << "a: " << a->x << " " << a->y << std::endl; a->~A(); std::copy(c, c+sizeof(A), std::ostream_iterator<int>(std::cout, " ")); std::cout << std::endl; std::fill(c, c+sizeof(A), 42); A* b = new(c) A; std::cout << "b: " << b->x << " " << b->y << std::endl; b->~A(); std::copy(c, c+sizeof(A), std::ostream_iterator<int>(std::cout, " ")); std::cout << std::endl; return 0; } > 42 42 42 42 42 42 42 42 a: 0 0 0 0 0 0 0 0 0 0 b: 707406378 1.51137e-13 42 42 42 42 42 42 42 42 Use the standard Luke, the standard: ISO C++ 2003, 8.5, paragraph 5
Evgenios1 Δημοσ. 26 Αυγούστου 2010 Δημοσ. 26 Αυγούστου 2010 Και πάλι, το γεγονός ότι ο compiler θα φτιάξει για σένα constructor, destructor και assignment operator δεν έχει καμία σχέση με το αν είναι POD ή όχι - θα σου τα φτιάξει για οποιαδήποτε κλάση άμα δεν τα δηλώσεις. Συμφωνω. Εξαλλου ο constructor δεν τιποτα αλλο απο μια function που εχει το ιδιο ονομα με το αντικειμενο. Και πρακτικα δεν βρισκετε μεσα στο αντικειμενο, αρα και καμια αλλαγη στο layout του αντικειμενου.
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.