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