Konstruktor kopiujący i operator przypisania

Jeśli nadpisuję operator= czy Konstruktor kopiujący automatycznie użyje nowego operatora? Podobnie, jeśli zdefiniuję Konstruktor kopiujący, czy operator= automatycznie 'odziedziczy' zachowanie od konstruktora kopiującego?

Author: mpm, 2011-03-20

5 answers

Nie, to różne operatory.

Konstruktor kopiujący służy do wytworzenia nowego obiektu. Kopiuje istniejący obiekt do nowo wybudowanego obiektu.Konstruktor kopiujący jest używany do inicjalizacji nowej instancji ze starego przykład. Niekoniecznie jest wywoływany przy przekazywaniu zmiennych przez wartość do funkcji lub jako wartości zwracane z funkcji.

Operator przypisania ma do czynienia z już istniejącym obiektem. Operator przypisania służy do zmiany istniejącego instancja mieć te same wartości co rvalue, co oznacza, że instancja musi być zniszczony i ponownie zainicjowany, jeśli ma wewnętrzną pamięć dynamiczną.

Przydatny link:

 39
Author: Javascript is GOD,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:34:19

Nie. Jeśli nie zdefiniujesz ctor kopii, zostanie wygenerowana wartość domyślna (w razie potrzeby). Jeśli nie zdefiniujesz operatora=, zostanie wygenerowana wartość domyślna (w razie potrzeby). Nie używają siebie nawzajem i możesz je zmieniać niezależnie.

 11
Author: Erik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-20 11:42:51

Nie. Są to różne obiekty.

Jeśli twoim problemem jest duplikacja kodu pomiędzy konstruktorem kopiującym a operatorem przypisania, rozważ następujący idiom o nazwie kopiowanie i zamiana :

struct MyClass
{
    MyClass(const MyClass&); // Implement copy logic here
    void swap(MyClass&) throw(); // Implement a lightweight swap here (eg. swap pointers)

    MyClass& operator=(MyClass x)
    {
        x.swap(*this);
        return *this;
    }
};

W ten sposób operator= użyje konstruktora kopiującego do zbudowania nowego obiektu, który zostanie wymieniony z *this i zwolniony (ze starym this wewnątrz) przy wyjściu funkcji.

 5
Author: Alexandre C.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-20 11:52:46

Nie, nie są tym samym operatorem.

 1
Author: Jonathan Wood,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-20 11:43:21

Nie.

I koniecznie przyjrzyj się zasadzie trzech (lub reguła pięciu przy uwzględnieniu wartości R)

 0
Author: stijn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:17:58