matematykaszkolna.pl
c++ Si plas plas: Konstruktor kopiujący w C++ moglby mi ktos wyjasnic idee niejawnego konstruktora kopiujacego? o ile mam jakieś pomysły do czego moze sie przydac własny konstruktor kopiujacy to nie wiem jakie zadanie ma niejawny
25 lut 10:23
Dziadek Mróz: /* __data; // dwa _ oznaczają daną prywatną _data; // jeden _ oznacza daną chronioną data; // brak _ oznacza daną publiczną */ #include <iostream> class Object { private: int __data; // dana prywatna public: Object() // konstruktor domyślny { __data = 0; } Object(int d) // konstruktor inicjujący { __data = d; } Object(const Object &o) // konstruktor kopiujący po referencji { __data = o.data(); } Object(Object *o) // konstruktor kopiujący po wskaźniku { __data = (*o).data(); } int data() const // metoda zwracająca daną prywatną { return __data; } }; int main(int argc, char **argv) { Object o; // obiekt Object *ptr_o = new Object(3); // obiekt wskaźnikowy Object o1(o); // kopia po refrencji Object o2(ptr_o); // kopia po wskaźniku Object *o3 = new Object(o); // wskaźnik na kopię po refrencji Object *o4 = new Object(ptr_o); // wskaźnik na kopię po wskaźniku // wyświetlenie każdego obiektu i jego zawartości std::cout << "o: " << o.data() << std::endl; std::cout << "*ptr_o: " << (*ptr_o).data() << std::endl; std::cout << "o1(o): " << o1.data() << std::endl; std::cout << "o2(ptr_o): " << o2.data() << std::endl; std::cout << "*o3(o): " << (*o3).data() << std::endl; std::cout << "*o4(ptr_o): " << (*o4).data() << std::endl; // czyścimy wskaźniki delete ptr_o; delete o3; delete o4; return 0; }
25 lut 12:43
Pytający: Ideą zapewne jest standardowe "mniej roboty". Niejednokrotnie domyślny konstruktor kopiujący jest wystarczający i zwyczajnie oszczędza pisania. Bez takiego konstruktora nie mógłbyś napisać chociażby funkcji przyjmującej argument danej klasy przez wartość (musiałbyś napisać własny konstruktor kopiujący, niejednokrotnie tożsamy z tym domyślnym). Czy chociażby dodając jakąś składową do klasy, musiałbyś odpowiednio uzupełnić konstruktor kopiujący (co zwiększa ryzyko błędu), natomiast domyślny konstruktor kopiujący uaktualni się z automatu. Wiadomo − czasem potrzebny jest własny konstruktor kopiujący i trzeba się napocić, narobić i napisać, ale przynajmniej w części przypadków oszczędza się tylee pisania i okazji do popełnienia błędu.
25 lut 12:49
Si plas plas: wielkie dzieki Panowie!
26 lut 15:38