2012-05-05 11 views
12

Powiel możliwe:
How are C array members handled in copy control functions?C++: jak działa przypisanie członkowskie?

Jeśli nie zastępują operator = z klasy, użyje domyślnego przypisania memberwise.

Ale co to znaczy?

struct A { 
    int array[100]; 
}; 
A a; 
A b=a; 

Brak błędu. W jaki sposób b radzi sobie z a 's ? Normalnie array_b = array_a jest nieprawidłowy.

Innym exampe:

struct A { 
    vector<int> vec; 
}; 
A a; 
A b=a; 

Jak b radzi sobie a „s vec? Poprzez przypisanie (vec_b = vec_a), konstruktora (vec_b = vector<int>(vec_a)) lub innej tajemniczej drogi?

+0

możliwy duplikat http://stackoverflow.com/questions/4164279/how-are-c-array-members-handled-in-copy-control-functions – Invictus

Odpowiedz

9
A b=a; 

nie jest zadanie, to nazywa się Copy Initialization.

Niejawnie wygenerowany konstruktor kopii jest wywoływany w celu utworzenia nowego obiektu b z istniejącego obiektu a.
Niejawnie wygenerowany konstruktor kopiowania tworzy kopię elementu array.

Dla kompletności dodam tutaj standardowy cytat z zaznaczonego duplikatu.

C++ 03 Standardowe: 12,8 (klasa kopiowanie obiektów)

Każdy podobiekt są kopiowane w sposób odpowiedni do tego typu:

  • jeśli podobiekt jest typu klasy, stosowany jest konstruktor kopii dla tej klasy;
  • jeśli podobiekt jest tablicą, każdy element jest kopiowany w sposób odpowiedni do typu elementu;
  • jeśli podobiekt jest typu skalarnego, używany jest wbudowany operator przypisania.
+0

Generalnie tak. Co to jest płytka kopia tablicy? –

+0

@KonradRudolph: W tym przypadku 'memcpy'. * Płytka kopia * odnosi się do wskaźników i to jest powód ** reguły trzech **. –

+0

Nie brzmi tak płytko. –

1

Jeśli członkowie mają konstruktorów kopii, zostaną wywołani. Jeśli nie, domyślny konstruktor kopiowania jest równoważny memcpy. Zobacz Memberwise Assignment and Initialization.

W przypadku tablic bez wskaźnika, każdy element jest kopiowany.

Powiązane problemy