7
int a[10]; 
int b[10]; 
a = b; 

//C++ domyślny operator przypisania

struct test { 
    int a[10]; 
}; 

test a,b; 
a = b; 

Pierwszy kod nie skompilować, ponieważ nie możemy przypisać tablicę, ale drugi nie. Czy nie jest domyślnym operatorem przypisania klasy po prostu wywołanie przypisania dla każdego elementu danych? Dlaczego drugi kod się kompiluje?

+0

Domyślnym operatorem przypisania klasy skopiuje wszystkie elementy tablicy. W ten sposób 'std :: array' działa bez użycia przez użytkownika. – chris

+1

Ponieważ wyjątek został wykonany dla tablic jako członków. –

+0

Dlaczego warto zaangażować std :: array? Czy czegoś brakuje? – Frodo

Odpowiedz

4

z projektu C++ 11, odcinek 12.8:

niejawnie zdefiniowane przez operatora przypisania kopii/przejście przez nie związków klasy X wykonuje memberwise zadanie kopiowania/jej podobiektów. Bezpośrednie klasy bazowe X są przypisywane najpierw, w kolejności ich deklaracji na liście specyfikacji bazowej, a następnie bezpośrednie niestatyczne elementy danych X są przypisywane, w kolejności, w jakiej zostały zadeklarowane w definicji klasy. . Niech x będzie albo parametrem funkcji, albo, dla operatora ruchu, wartością x odnoszącą się do parametru. Każdy podobiekt jest przypisany w sposób odpowiedni do jego typu:

- jeśli podobiekt jest typu klasy, tak jakby przez wywołanie operatora = z podobiektem jako wyrażeniem obiektu i odpowiadającym podobiektowi x jako pojedynczą funkcją argument (jak w przypadku jawnej kwalifikacji, czyli ignorowanie wszelkich możliwych wirtualnych funkcji nadpisujących w bardziej pochodnych klasach);

- jeśli podobiekt jest tablicą, każdy element jest przypisany, w sposób odpowiedni do typu elementu;

- jeśli podobiekt jest typu skalarnego, używany jest wbudowany operator przypisania.

Ważną częścią tutaj jest: if the subobject is an array, each element is assigned, in the manner appropriate to the element type;