Προς το περιεχόμενο

Αντικείμενα και κλάσεις


Giorgos3924

Προτεινόμενες αναρτήσεις

Δημοσ.

Η διαφορά που έχουν τα C structs από τις κλάσεις είναι πως οι κλάσεις εκτός από δεδομένα ενθυλακώνουν και συμπεριφορά. Επίσης συμβάλλουν σε αντικειμενοστρεφείς έννοιες όπως η κληρονομικότητα και ο πολυμορφισμός.

 

Τα C++ structs δεν έχουν καμιά διαφορά εκτός του ότι το default acess specifier τους είναι public ενώ στις κλάσεις private.

Βέβαια αν τα μέλη που διαθέτει είναι όλα POD(Plain-old datatypes) όπως ints, floats , booleans τότε και η δομή θεωρείται POD, άρα δε χρειάζεται constructor, copy constructor, destructor και assignment operator.

Δημοσ.

Βέβαια αν τα μέλη που διαθέτει είναι όλα POD(Plain-old datatypes) όπως ints, floats , booleans τότε και η δομή θεωρείται POD, άρα δε χρειάζεται constructor, copy constructor, destructor και assignment operator.

 

Αυτά δεν έχουν καμία σχέση με το POD. Άμα δεν δηλώσεις constructors, destructor και assignment operator, ο compiler θα σου δώσει από μόνος του.

Δημοσ.

Aν τα μέλη ενός struct ή μιας class είναι όλα PUBLIC και POD (union, enum, int, float, bool ) θεωρούνται κι αυτά PODs και ούτε ο compiler φτιάχνει implicitly constructors, destructors, assingment operators.

Δημοσ.

Και πάλι, το γεγονός ότι ο compiler θα φτιάξει για σένα constructor, destructor και assignment operator δεν έχει καμία σχέση με το αν είναι POD ή όχι - θα σου τα φτιάξει για οποιαδήποτε κλάση άμα δεν τα δηλώσεις.

 

Ειδικότερα για τις POD κλάσεις, θα σου δώσει default constructor που κάνει zero initialize όλα τα member variables, copy constructor και assignment operator που κάνουν memcpy και destructor που είναι άδειος.

Δημοσ.

Δοκίμασα αυτό:

 

>
#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 τίποτα.

Δημοσ.

>
#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

Δημοσ.
Και πάλι, το γεγονός ότι ο compiler θα φτιάξει για σένα constructor, destructor και assignment operator δεν έχει καμία σχέση με το αν είναι POD ή όχι - θα σου τα φτιάξει για οποιαδήποτε κλάση άμα δεν τα δηλώσεις.

Συμφωνω. Εξαλλου ο constructor δεν τιποτα αλλο απο μια function που εχει το ιδιο ονομα με το αντικειμενο. Και πρακτικα δεν βρισκετε μεσα στο αντικειμενο, αρα και καμια αλλαγη στο layout του αντικειμενου.

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...