2012-09-27 8 views
5

I podobnie, czy domyślny konstruktor kopiowania wywołuje konstruktor kopiowania na wszystkich elementach? Na przykład, jeśli klasa ma człon non-POD tak:Czy domyślny operator przypisania operator = na wszystkich członkach?

class A 
{ 
    std::string str; 
}; 

... będzie domyślny kompilator generowane konstruktor kopiujący i operator przypisania praca poprawnie? Czy wywołają konstruktor kopii ciągu i operator=, czy też po prostu wykonają bitową kopię zmiennej składowej str?

Innymi słowy, czy posiadanie członka std::string oznacza, że ​​ta klasa wymaga konstruktora kopiowania i operatora przypisania zaimplementowanego przez użytkownika?

Odpowiedz

5

Tak, wygenerowany przez kompilator będzie działał poprawnie.

Jeśli jednak wdrożysz własne i pozostawisz je puste, nie będzie.

Jeśli nie zarządzasz pamięcią, a wszyscy członkowie zapewniają prawidłowe kopiowanie/przypisanie/zniszczenie, nie potrzebujesz (i nie powinieneś) implementować własnego konstruktora kopiowania/destruktora/operatora przypisania.

Innymi słowy, nie mając członkiem std :: string na myśli tej klasy potrzebuje konstruktor kopiujący użytkownika wdrożony i operator przypisania?

Nie, wygenerowane przez kompilator będą działać idealnie.

+0

"Tak, wygenerowany przez kompilator będzie działał poprawnie." - nawet dla klas z członkami const? –

+0

@spin_eight, a następnie kopia lub zadanie nawet się nie skompiluje. –

+3

@LuchianGrigore: W rzeczywistości kopia się skompiluje. Zadanie nie będzie oczywiście. –