Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

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

im Zusammenhang mit Objekten bei der objektorientierten Programmierung mit Visual C++

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???

 
#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...

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

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

Gruß

Diablo999

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.

*grmpfl*

:bimei :bimei

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.