Zum Inhalt springen

Tiefe und Flache Kopie


Didii

Empfohlene Beiträge

Hallo,

kann mir bitte jemand "theoretisch" den Unterschied zwischen Tiefer und Flacher Kopie erläutern. Ich brauch gar kein konkretes Bsp. sondern nur ned Erklärung falls so was bei der Prüfung (FI/AE) dran kommen würde.

ich hoffe auf eine leicht verständliche u. nachvollziehbare Antwort

cu

didii

Link zu diesem Kommentar
Auf anderen Seiten teilen

Also, es gibt ja zu jeder Klasse einen CopyKonstruktor, der wird aufgerufen wenn

du z.B. ein Objekt einem anderen zuweist:



class Klasse1 

{

  private:

    int Member1;

   char* Member 2;

....

}


int main()

{

  Klasse1 o1(1000, "Teststring");

  Klasse1 o2(o1);  // Hier wird der Copykonstruktor des Objektes o2 aufgerufen

}

Der Standardmäsige Copykonstruktor macht nichts anderes als alle members von

dem einen in das andere Objekt zu übernehmen. Angnenommen der Konstruktor von

Klasse1 füllt die Variable Member1 mit der übergebenen Zahl und allociert Speicher

für den übergebenen String und sichert den Pointer in Member2 dann kopiert der

Standard Copykonstruktor die Inhalte der Variablen Member1 und member2 in o2.

Jedoch zeigen jetzt die beiden Pointer, also in o1 und o2 auf den gelcihen String.

Wenn du allerdings Objekte als Members der Klasse definiert hast wird rekursiv natürlich

deren CopyKonstruktor aufgerufen :-)

==> Dieser Verfahren nennt man Flat Copy

Soll jetzt aber der String auch mitkopiert werden muss man sich selbst nen

Copykonstruktor schreiben der eben Speicher allociert und den String aus

o1 kopiert.

==> Dieses Verfahren nennt man Deep Copy

Hoffe das ist einigermaßen Verständlich

Gruß

Diablo999

PS: Das wär doch was fürs FAQ???

Link zu diesem Kommentar
Auf anderen Seiten teilen

 
#include <stdio.h>

void main() {

int* a1 = new int[5]; //Array 1
int* a2; //Array 2

for(int i = 0; i < 5; i++)
a1[i] = i; // 0-5 in Array 1 schreiben

a2 = a1; //flache Kopie

for(i = 0; i < 5; i++)
a1[i] = 0; //Alle Positionen in Array 1 auf 0 setzen

for(i = 0; i < 5; i++)
printf("%d ", a2[i]); //Ausgeben der Positionen von Array 2

printf("\n");
//man sieht, die Änderungen in Array 1 wirken sich auf Array 2 aus, weil eigentlich nur ein Array
//im Speicher existiert, und a1 und a2 nur auf den gleichen Speicherverweisen

for(i = 0; i < 5; i++)
a1[i] = i; // 0-5 in Array 1 schreiben


//Tiefe kopie:
//Man muss sich selber erstmal Speicher anlegen:
a2 = new int[5];

for(i = 0; i < 5; i++)
a2[i] = a1[i]; //jede einzelne Zahl aus dem Array 1 in Array 2 kopieren

for(i = 0; i < 5; i++)
a1[i] = 0; //Alle Positionen in Array 1 auf 0 setzen


for(i = 0; i < 5; i++)
printf("%d ", a2[i]); //Ausgeben der Positionen von Array 2

//Man sieht: Die Änderungen an Array 1 wirken sich so nichtmehr auf Array 2 aus,
// weil jedes Array jetzt seinen eigenen Speicher mit eigenem Inhalt hat.

delete[] a1;
delete[] a2;

}[/PHP]

Ich find das Beispiel einfacher.

Bei höherer Schachteltiefe von Pointern wird das Kopieren natürlich komplizierter.

Gewissermaßen ist eine "flache Kopie" gar keine Kopie, sondern eigentlich nur eine Zuweisung von einer Adresse an eine Variable...

Link zu diesem Kommentar
Auf anderen Seiten teilen

Jo, ist auf jeden fall verständlich, aber war ja nach flache und tiefe Kopie

bei der OOP gefragt :floet: :floet: :floet:

Gruß

Diablo999

läuft aber auf das Selbe raus, dass man das bei der OOP halt im Copykonstruktor, bzw jedem Konstruktor dem ein Pointer übergeben wird beachten muss, ist eigentlich nur die logische Weiterführung.

Sollte man eigentlich auch beim = operator beachten.

Genau deswegen, sollte man eigentlich so etwas eher allgemein, verstehen, dann achtet man auch bei der OOP automatisch darauf.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...