Kopierkonstruktor
Ein Kopierkonstruktor, oft Copy-Konstruktor genannt, ist in der Objektorientierten Programmierung ein spezieller Konstruktor, der eine Referenz auf ein Objekt desselben Typs als Parameter entgegennimmt und die Aufgabe hat, eine Kopie des Objektes zu erstellen.<ref>{{#if:|{{#iferror: {{#iferror:{{#invoke:Vorlage:FormatDate|Execute}}|}}| |}}}}{{#if:|{{{autor}}}: }}{{#if:|{{#if:Copy Constructor in C++|[{{#invoke:Vorlage:Internetquelle|archivURL|1={{#invoke:URLutil|getNormalized|1={{{archiv-url}}}}}}} {{#invoke:Vorlage:Internetquelle|TitelFormat|titel=Copy Constructor in C++}}]{{#if:| ({{{format}}})}}{{#if:| {{{titelerg}}}{{#invoke:Vorlage:Internetquelle|Endpunkt|titel={{{titelerg}}}}}}}}}|{{#if:https://www.geeksforgeeks.org/copy-constructor-in-cpp/%7C{{#if:{{#invoke:TemplUtl%7Cfaculty%7C}}%7C{{#invoke:Vorlage:Internetquelle%7CTitelFormat%7Ctitel={{#invoke:WLink%7CgetEscapedTitle%7C1=Copy Constructor in C++}}}}|[{{#invoke:URLutil|getNormalized|1=https://www.geeksforgeeks.org/copy-constructor-in-cpp/}} {{#invoke:Vorlage:Internetquelle|TitelFormat|titel={{#invoke:WLink|getEscapedTitle|1=Copy Constructor in C++}}}}]}}{{#if:| ({{{format}}}{{#if:GeeksforGeeks2014-06-07{{#if: 2023-07-27 | {{#if:{{#invoke:TemplUtl|faculty|}}||1}}}}
| )
| {{#if:{{#ifeq:en-us|de||{{#if:en-us|1}}}}| ;
| )}}}}}}{{#if:| {{{titelerg}}}{{#invoke:Vorlage:Internetquelle|Endpunkt|titel={{{titelerg}}}}}}}}}}}{{#if:https://www.geeksforgeeks.org/copy-constructor-in-cpp/%7C{{#if:{{#invoke:URLutil%7CisResourceURL%7C1=https://www.geeksforgeeks.org/copy-constructor-in-cpp/}}%7C%7C}}}}{{#if:Copy Constructor in C++|{{#if:{{#invoke:WLink|isValidLinktext|1=Copy Constructor in C++|lines=0}}||}}}}{{#if: GeeksforGeeks| In: {{#invoke:Vorlage:Internetquelle|TitelFormat|titel=GeeksforGeeks}}}}{{#if: | {{{hrsg}}}{{#if: 2014-06-07|,|{{#if: 2023-07-27 | {{#if:{{#invoke:TemplUtl|faculty|}}||,}}}}}}}}{{#if: 2014-06-07| {{#if:{{#invoke:DateTime|format|2014-06-07|noerror=1}}
|{{#invoke:DateTime|format|2014-06-07|T._Monat JJJJ}}
|{{#invoke:TemplUtl|failure|1=Fehler bei Vorlage:Internetquelle, datum=2014-06-07|class=Zitationswartung}} }}{{#if: |,|{{#if: 2023-07-27 | {{#if:{{#invoke:TemplUtl|faculty|}}||,}}}}}}}}{{#if: | S. {{{seiten}}}{{#if: |,|{{#if: 2023-07-27 | {{#if:{{#invoke:TemplUtl|faculty|}}||,}}}}}}}}{{#if: {{#invoke:TemplUtl|faculty|}}| {{#if:2014-06-07|{{#if:|archiviert|ehemals}}|{{#if:|Archiviert|Ehemals}}}} {{#if:|vom|im}} Vorlage:Referrer{{#if:{{#invoke:TemplUtl|faculty|}}| (nicht mehr online verfügbar)}}{{#if: | am {{#iferror: {{#iferror:{{#invoke:Vorlage:FormatDate|Execute}}|}}|{{{archiv-datum}}}{{#if:529593||(?)}}}}}}{{#if: 2023-07-27|;}}}}{{#if: 2023-07-27| {{#if:2014-06-07{{#invoke:TemplUtl|faculty|}}|abgerufen|Abgerufen}} {{#switch: {{#invoke:Str|len| {{#invoke:DateTime|format| 2023-07-27 |ISO|noerror=1}} }}
|4=im Jahr
|7=im
|10=am
|#default={{#invoke:TemplUtl|failure|1=Fehler bei Vorlage:Internetquelle, abruf=2023-07-27|class=Zitationswartung}} }} {{#invoke:DateTime|format|2023-07-27|T._Monat JJJJ}}
| {{#invoke:TemplUtl|failure|1=Vorlage:Internetquelle | abruf=2026-MM-TT ist Pflichtparameter}} }}{{#if:{{#ifeq:en-us|de||{{#if:en-us|1}}}}|{{#if:GeeksforGeeks2014-06-07{{#if: 2023-07-27 | {{#if:{{#invoke:TemplUtl|faculty|}}||1}}}}
| (
| {{#if: | | (}}
}}{{#ifeq:{{#if:en-us|en-us|de}}|de||
{{#invoke:Multilingual|format|en-us|slang=!|split=[%s,]+|shift=m|separator=, }}}}{{#if: |{{#ifeq:{{#if:en-us|en-us|de}}|de||, }}{{{kommentar}}}}})}}{{#if: 2014-06-07{{#if: 2023-07-27 | {{#if:{{#invoke:TemplUtl|faculty|}}||1}} }}en-us|{{#if: |: {{
#if:
| „{{
#ifeq: {{#if:{{#if: {{#invoke:templutl|faculty|}}|de-ch|de}}|{{#if: {{#invoke:templutl|faculty|}}|de-ch|de}}|de}} | de
| Vorlage:Str trim
| {{#invoke:Vorlage:lang|flat}}
}}“
| {{#ifeq: {{#if:{{#if: {{#invoke:templutl|faculty|}}|de-ch|de}}|{{#if: {{#invoke:templutl|faculty|}}|de-ch|de}}|de}} | de
| „Vorlage:Str trim“
| {{#invoke:Text|quote
|1={{#if:
| {{#invoke:Vorlage:lang|flat}}
| {{#invoke:Vorlage:lang|flat}} }}
|2={{#if: {{#invoke:TemplUtl|faculty|}}|de-CH|de}}
|3=1}} }}
}}{{#if:
| (<templatestyles src="Person/styles.css" />{{#if: | : }}{{#if: | , deutsch: „“ }})
| {{#if:
| ({{#if: | , deutsch: „“ }})
| {{#if: | (deutsch: „“) }}
}}
}}{{#if: {{{zitat}}}
| {{#if:
| {{#if: {{{zitat}}}
| Vorlage:": Text= und 1= gleichzeitig, bzw. Pipe zu viel }} }}
| Vorlage:": Text= fehlt }}{{#if: | {{#if: {{#invoke:Text|unstrip|{{{ref}}}}}
| Vorlage:": Ungültiger Wert: ref=
| {{{ref}}} }}
}}|.{{#if:{{#invoke:TemplUtl|faculty|}}|{{#if:||{{#ifeq: | JaKeinHinweis |{{#switch:
|0|=Vorlage:Toter Link/Core{{#if: https://www.geeksforgeeks.org/copy-constructor-in-cpp/ | {{#if: | [1] }} (Seite {{#switch:|no|0|=|dauerhaft }}nicht mehr abrufbar{{#if: | , festgestellt im {{#invoke:DateTime|format||F Y}} }}. Suche im Internet Archive ){{#if: | {{#if: deadurlausgeblendet | | Vorlage:Toter Link/archivebot }} }} | (Seite {{#switch:|no|0|=|#default=dauerhaft }}nicht mehr abrufbar{{#if: | , festgestellt im {{#invoke:DateTime|format||F Y}} }}.) }}{{#switch: |no|0|= |#default={{#if: || }} }}{{#invoke:TemplatePar|check |opt = inline= url= text= datum= date= archivebot= bot= botlauf= fix-attempted= checked= |cat = Wikipedia:Vorlagenfehler/Vorlage:Toter Link |errNS = 0 |template = Vorlage:Toter Link |format = |preview = 1 }}{{#if: https://www.geeksforgeeks.org/copy-constructor-in-cpp/ | {{#if:{{#invoke:URLutil|isWebURL|https://www.geeksforgeeks.org/copy-constructor-in-cpp/}} || {{#if: || }} }} | {{#if: | {{#if: || }} | {{#if: || }} }} }}{{#if: | {{#if:{{#invoke:DateTime|format||F Y|noerror=1}} || {{#if: || }} }} }}{{#switch: deadurl |checked|deadurl|= |#default= {{#if: || }} }}|#default= https://wiki-de.moshellshocker.dns64.de/index.php?title=Wikipedia:Defekte_Weblinks&dwl=https://www.geeksforgeeks.org/copy-constructor-in-cpp/ Die nachstehende Seite ist {{#switch:|no|0|=|dauerhaft }}nicht mehr abrufbar]{{#if: | , festgestellt im {{#invoke:DateTime|format||F Y}} }}. (Suche im Internet Archive. ) {{#if: | {{#if: deadurlausgeblendet | | Vorlage:Toter Link/archivebot }} }}Vorlage:Toter Link/Core{{#switch: |no|0|= |#default= {{#if: || }} }}{{#invoke:TemplatePar|check |all = inline= url= |opt = datum= date= archivebot= bot= botlauf= fix-attempted= checked= |cat = Wikipedia:Vorlagenfehler/Vorlage:Toter Link |errNS = 0 |template = Vorlage:Toter Link |format = |preview = 1 }}{{#if: https://www.geeksforgeeks.org/copy-constructor-in-cpp/ | {{#if:{{#invoke:URLutil|isWebURL|https://www.geeksforgeeks.org/copy-constructor-in-cpp/}} || {{#if: || }} }} }}{{#if: | {{#if:{{#invoke:DateTime|format||F Y|noerror=1}} || {{#if: || }} }} }}{{#switch: deadurl |checked|deadurl|= |#default= {{#if: || }} }}[https://www.geeksforgeeks.org/copy-constructor-in-cpp/ }}|{{#switch: |0|=Vorlage:Toter Link/Core{{#if: https://www.geeksforgeeks.org/copy-constructor-in-cpp/ | {{#if: | [2] }} (Seite {{#switch:|no|0|=|dauerhaft }}nicht mehr abrufbar{{#if: | , festgestellt im {{#invoke:DateTime|format||F Y}} }}. Suche im Internet Archive ){{#if: | {{#if: | | Vorlage:Toter Link/archivebot }} }} | (Seite {{#switch:|no|0|=|#default=dauerhaft }}nicht mehr abrufbar{{#if: | , festgestellt im {{#invoke:DateTime|format||F Y}} }}.) }}{{#switch: |no|0|= |#default={{#if: || }} }}{{#invoke:TemplatePar|check |opt = inline= url= text= datum= date= archivebot= bot= botlauf= fix-attempted= checked= |cat = Wikipedia:Vorlagenfehler/Vorlage:Toter Link |errNS = 0 |template = Vorlage:Toter Link |format = |preview = 1 }}{{#if: https://www.geeksforgeeks.org/copy-constructor-in-cpp/ | {{#if:{{#invoke:URLutil|isWebURL|https://www.geeksforgeeks.org/copy-constructor-in-cpp/}} || {{#if: || }} }} | {{#if: | {{#if: || }} | {{#if: || }} }} }}{{#if: | {{#if:{{#invoke:DateTime|format||F Y|noerror=1}} || {{#if: || }} }} }}{{#switch: |checked|deadurl|= |#default= {{#if: || }} }}|#default= https://wiki-de.moshellshocker.dns64.de/index.php?title=Wikipedia:Defekte_Weblinks&dwl=https://www.geeksforgeeks.org/copy-constructor-in-cpp/ Die nachstehende Seite ist {{#switch:|no|0|=|dauerhaft }}nicht mehr abrufbar]{{#if: | , festgestellt im {{#invoke:DateTime|format||F Y}} }}. (Suche im Internet Archive. ) {{#if: | {{#if: | | Vorlage:Toter Link/archivebot }} }}Vorlage:Toter Link/Core{{#switch: |no|0|= |#default= {{#if: || }} }}{{#invoke:TemplatePar|check |all = inline= url= |opt = datum= date= archivebot= bot= botlauf= fix-attempted= checked= |cat = Wikipedia:Vorlagenfehler/Vorlage:Toter Link |errNS = 0 |template = Vorlage:Toter Link |format = |preview = 1 }}{{#if: https://www.geeksforgeeks.org/copy-constructor-in-cpp/ | {{#if:{{#invoke:URLutil|isWebURL|https://www.geeksforgeeks.org/copy-constructor-in-cpp/}} || {{#if: || }} }} }}{{#if: | {{#if:{{#invoke:DateTime|format||F Y|noerror=1}} || {{#if: || }} }} }}{{#switch: |checked|deadurl|= |#default= {{#if: || }} }}[https://www.geeksforgeeks.org/copy-constructor-in-cpp/ }} }}}}}}}}}}{{#if:| {{#invoke:Vorlage:Internetquelle|archivBot|stamp={{{archiv-bot}}}|text={{#if:|Vorlage:Webarchiv/archiv-bot}}
}}}}{{#invoke:TemplatePar|check |all= url= titel= |opt= autor= hrsg= format= sprache= titelerg= werk= seiten= datum= abruf= zugriff= abruf-verborgen= archiv-url= archiv-datum= archiv-bot= kommentar= zitat= AT= CH= offline= |cat= {{#ifeq: 0 | 0 | Wikipedia:Vorlagenfehler/Vorlage:Internetquelle}} |template= Vorlage:Internetquelle |format=0 |preview=1 }}</ref>
Beispiel
Als Beispiel dient folgende Klasse in C++, die einen gewöhnlichen Konstruktor und einen Kopierkonstruktor beinhaltet. Der gewöhnliche Konstruktor nimmt einen String an, während der Kopierkonstruktor den String aus einem anderen Objekt derselben Klasse übernimmt. <syntaxhighlight lang="cpp">
- include <string> // wird für die Klasse std::string benötigt
class Beispiel { public:
// Gewöhnlicher Konstruktor
Beispiel(std::string text) : text(text) { }
// Kopierkonstruktor
// nimmt in C++ immer eine konstante (const) Referenz (&) zum Objekt derselben Klasse an.
// Die übliche Bezeichnung `rhs` bedeutet hier "Right Hand Side"
Beispiel(const Beispiel& rhs) : text(rhs.text) { }
private:
std::string text;
}; </syntaxhighlight>
Aufruf
Der Kopierkonstruktor wird bei der Initialisierung eines Objektes mittels eines anderen Objekts desselben Typs aufgerufen. In C++ wird dieses andere Objekt als einziger Parameter dem Konstruktor übergeben. Es erfolgt in der Deklaration des Objektes die Zuweisung des anderen Objektes oder das Objekt wird als Wertparameter an eine Funktion oder Methode übergeben.
Beispiel in C++ (Fortsetzung): <syntaxhighlight lang="cpp"> Beispiel bsp("Test"); // Gewöhnlicher Konstruktor Beispiel bsp2 = bsp; // Kopierkonstruktor, Zuweisungssyntax Beispiel bsp3(bsp); // Kopierkonstruktor, Aufrufsyntax </syntaxhighlight>
Verwendung
Einige Programmiersprachen, wie beispielsweise C++, stellen einen vordefinierten Kopierkonstruktor zur Verfügung, der einfach die Elementvariablen des zu kopierenden Objektes in die des zu initialisierenden Objektes kopiert. (In anderen Programmiersprachen, z. B. Java, muss der Kopierkonstruktor explizit programmiert werden.) Dies kann allerdings zu Problemen führen. Sind unter den Elementvariablen nämlich Handles auf Ressourcen und gibt das bereits existente Objekt die Ressourcen frei, so ist das Handle in dem per Standard-Kopierkonstruktor erstellten Objekt ungültig und seine Verwendung kann dann zu Programmabstürzen führen. Pointer auf Speicherbereiche werden so ebenfalls kopiert, sodass die Kopie des Ursprungsobjekts nun Pointer auf bereits genutzte Speicherbereiche besitzt. Werden jetzt diese Speicherbereiche geändert, z. B. durch eine Änderung des Ursprungs oder des kopierten Objekts, so hat das Auswirkungen auf alle Objekte, die Pointer auf den gleichen Speicherbereich verwenden.
Im Beispiel enthält jede Instanz von Zeichenkette ihren eigenen Speicher, der beim Aufruf des Kopierkonstruktors reserviert wird. Wenn jede Kopie eines Objektes exklusiven Zugriff auf ihre Ressourcen hat, d. h., sie nicht mit anderen Objekten teilen muss, spricht man von einer tiefen Kopie (engl. deep copy). Andernfalls spricht man von einer flachen Kopie (engl. shallow copy).<ref>{{#if:|{{#iferror: {{#iferror:{{#invoke:Vorlage:FormatDate|Execute}}|}}| |}}}}{{#if:|{{{autor}}}: }}{{#if:|{{#if:Deep Copy and Shallow Copy in C++|[{{#invoke:Vorlage:Internetquelle|archivURL|1={{#invoke:URLutil|getNormalized|1={{{archiv-url}}}}}}} {{#invoke:Vorlage:Internetquelle|TitelFormat|titel=Deep Copy and Shallow Copy in C++}}]{{#if:| ({{{format}}})}}{{#if:| {{{titelerg}}}{{#invoke:Vorlage:Internetquelle|Endpunkt|titel={{{titelerg}}}}}}}}}|{{#if:https://dotnettutorials.net/lesson/deep-copy-and-shallow-copy-in-cpp/%7C{{#if:{{#invoke:TemplUtl%7Cfaculty%7C}}%7C{{#invoke:Vorlage:Internetquelle%7CTitelFormat%7Ctitel={{#invoke:WLink%7CgetEscapedTitle%7C1=Deep Copy and Shallow Copy in C++}}}}|[{{#invoke:URLutil|getNormalized|1=https://dotnettutorials.net/lesson/deep-copy-and-shallow-copy-in-cpp/}} {{#invoke:Vorlage:Internetquelle|TitelFormat|titel={{#invoke:WLink|getEscapedTitle|1=Deep Copy and Shallow Copy in C++}}}}]}}{{#if:| ({{{format}}}{{#if:{{#if: 2023-07-27 | {{#if:{{#invoke:TemplUtl|faculty|}}||1}}}}
| )
| {{#if:{{#ifeq:en-us|de||{{#if:en-us|1}}}}| ;
| )}}}}}}{{#if:| {{{titelerg}}}{{#invoke:Vorlage:Internetquelle|Endpunkt|titel={{{titelerg}}}}}}}}}}}{{#if:https://dotnettutorials.net/lesson/deep-copy-and-shallow-copy-in-cpp/%7C{{#if:{{#invoke:URLutil%7CisResourceURL%7C1=https://dotnettutorials.net/lesson/deep-copy-and-shallow-copy-in-cpp/}}%7C%7C}}}}{{#if:Deep Copy and Shallow Copy in C++|{{#if:{{#invoke:WLink|isValidLinktext|1=Deep Copy and Shallow Copy in C++|lines=0}}||}}}}{{#if: | In: {{#invoke:Vorlage:Internetquelle|TitelFormat|titel={{{werk}}}}}}}{{#if: | {{{hrsg}}}{{#if: |,|{{#if: 2023-07-27 | {{#if:{{#invoke:TemplUtl|faculty|}}||,}}}}}}}}{{#if: | {{#if:{{#invoke:DateTime|format|{{{datum}}}|noerror=1}}
|{{#invoke:DateTime|format|{{{datum}}}|T._Monat JJJJ}}
|{{#invoke:TemplUtl|failure|1=Fehler bei Vorlage:Internetquelle, datum={{{datum}}}|class=Zitationswartung}} }}{{#if: |,|{{#if: 2023-07-27 | {{#if:{{#invoke:TemplUtl|faculty|}}||,}}}}}}}}{{#if: | S. {{{seiten}}}{{#if: |,|{{#if: 2023-07-27 | {{#if:{{#invoke:TemplUtl|faculty|}}||,}}}}}}}}{{#if: {{#invoke:TemplUtl|faculty|}}| {{#if:|{{#if:|archiviert|ehemals}}|{{#if:|Archiviert|Ehemals}}}} {{#if:|vom|im}} Vorlage:Referrer{{#if:{{#invoke:TemplUtl|faculty|}}| (nicht mehr online verfügbar)}}{{#if: | am {{#iferror: {{#iferror:{{#invoke:Vorlage:FormatDate|Execute}}|}}|{{{archiv-datum}}}{{#if:529593||(?)}}}}}}{{#if: 2023-07-27|;}}}}{{#if: 2023-07-27| {{#if:{{#invoke:TemplUtl|faculty|}}|abgerufen|Abgerufen}} {{#switch: {{#invoke:Str|len| {{#invoke:DateTime|format| 2023-07-27 |ISO|noerror=1}} }}
|4=im Jahr
|7=im
|10=am
|#default={{#invoke:TemplUtl|failure|1=Fehler bei Vorlage:Internetquelle, abruf=2023-07-27|class=Zitationswartung}} }} {{#invoke:DateTime|format|2023-07-27|T._Monat JJJJ}}
| {{#invoke:TemplUtl|failure|1=Vorlage:Internetquelle | abruf=2026-MM-TT ist Pflichtparameter}} }}{{#if:{{#ifeq:en-us|de||{{#if:en-us|1}}}}|{{#if:{{#if: 2023-07-27 | {{#if:{{#invoke:TemplUtl|faculty|}}||1}}}}
| (
| {{#if: | | (}}
}}{{#ifeq:{{#if:en-us|en-us|de}}|de||
{{#invoke:Multilingual|format|en-us|slang=!|split=[%s,]+|shift=m|separator=, }}}}{{#if: |{{#ifeq:{{#if:en-us|en-us|de}}|de||, }}{{{kommentar}}}}})}}{{#if: {{#if: 2023-07-27 | {{#if:{{#invoke:TemplUtl|faculty|}}||1}} }}en-us|{{#if: |: {{
#if:
| „{{
#ifeq: {{#if:{{#if: {{#invoke:templutl|faculty|}}|de-ch|de}}|{{#if: {{#invoke:templutl|faculty|}}|de-ch|de}}|de}} | de
| Vorlage:Str trim
| {{#invoke:Vorlage:lang|flat}}
}}“
| {{#ifeq: {{#if:{{#if: {{#invoke:templutl|faculty|}}|de-ch|de}}|{{#if: {{#invoke:templutl|faculty|}}|de-ch|de}}|de}} | de
| „Vorlage:Str trim“
| {{#invoke:Text|quote
|1={{#if:
| {{#invoke:Vorlage:lang|flat}}
| {{#invoke:Vorlage:lang|flat}} }}
|2={{#if: {{#invoke:TemplUtl|faculty|}}|de-CH|de}}
|3=1}} }}
}}{{#if:
| (<templatestyles src="Person/styles.css" />{{#if: | : }}{{#if: | , deutsch: „“ }})
| {{#if:
| ({{#if: | , deutsch: „“ }})
| {{#if: | (deutsch: „“) }}
}}
}}{{#if: {{{zitat}}}
| {{#if:
| {{#if: {{{zitat}}}
| Vorlage:": Text= und 1= gleichzeitig, bzw. Pipe zu viel }} }}
| Vorlage:": Text= fehlt }}{{#if: | {{#if: {{#invoke:Text|unstrip|{{{ref}}}}}
| Vorlage:": Ungültiger Wert: ref=
| {{{ref}}} }}
}}|.{{#if:{{#invoke:TemplUtl|faculty|}}|{{#if:||{{#ifeq: | JaKeinHinweis |{{#switch:
|0|=Vorlage:Toter Link/Core{{#if: https://dotnettutorials.net/lesson/deep-copy-and-shallow-copy-in-cpp/ | {{#if: | [3] }} (Seite {{#switch:|no|0|=|dauerhaft }}nicht mehr abrufbar{{#if: | , festgestellt im {{#invoke:DateTime|format||F Y}} }}. Suche im Internet Archive ){{#if: | {{#if: deadurlausgeblendet | | Vorlage:Toter Link/archivebot }} }} | (Seite {{#switch:|no|0|=|#default=dauerhaft }}nicht mehr abrufbar{{#if: | , festgestellt im {{#invoke:DateTime|format||F Y}} }}.) }}{{#switch: |no|0|= |#default={{#if: || }} }}{{#invoke:TemplatePar|check |opt = inline= url= text= datum= date= archivebot= bot= botlauf= fix-attempted= checked= |cat = Wikipedia:Vorlagenfehler/Vorlage:Toter Link |errNS = 0 |template = Vorlage:Toter Link |format = |preview = 1 }}{{#if: https://dotnettutorials.net/lesson/deep-copy-and-shallow-copy-in-cpp/ | {{#if:{{#invoke:URLutil|isWebURL|https://dotnettutorials.net/lesson/deep-copy-and-shallow-copy-in-cpp/}} || {{#if: || }} }} | {{#if: | {{#if: || }} | {{#if: || }} }} }}{{#if: | {{#if:{{#invoke:DateTime|format||F Y|noerror=1}} || {{#if: || }} }} }}{{#switch: deadurl |checked|deadurl|= |#default= {{#if: || }} }}|#default= https://wiki-de.moshellshocker.dns64.de/index.php?title=Wikipedia:Defekte_Weblinks&dwl=https://dotnettutorials.net/lesson/deep-copy-and-shallow-copy-in-cpp/ Die nachstehende Seite ist {{#switch:|no|0|=|dauerhaft }}nicht mehr abrufbar]{{#if: | , festgestellt im {{#invoke:DateTime|format||F Y}} }}. (Suche im Internet Archive. ) {{#if: | {{#if: deadurlausgeblendet | | Vorlage:Toter Link/archivebot }} }}Vorlage:Toter Link/Core{{#switch: |no|0|= |#default= {{#if: || }} }}{{#invoke:TemplatePar|check |all = inline= url= |opt = datum= date= archivebot= bot= botlauf= fix-attempted= checked= |cat = Wikipedia:Vorlagenfehler/Vorlage:Toter Link |errNS = 0 |template = Vorlage:Toter Link |format = |preview = 1 }}{{#if: https://dotnettutorials.net/lesson/deep-copy-and-shallow-copy-in-cpp/ | {{#if:{{#invoke:URLutil|isWebURL|https://dotnettutorials.net/lesson/deep-copy-and-shallow-copy-in-cpp/}} || {{#if: || }} }} }}{{#if: | {{#if:{{#invoke:DateTime|format||F Y|noerror=1}} || {{#if: || }} }} }}{{#switch: deadurl |checked|deadurl|= |#default= {{#if: || }} }}[https://dotnettutorials.net/lesson/deep-copy-and-shallow-copy-in-cpp/ }}|{{#switch: |0|=Vorlage:Toter Link/Core{{#if: https://dotnettutorials.net/lesson/deep-copy-and-shallow-copy-in-cpp/ | {{#if: | [4] }} (Seite {{#switch:|no|0|=|dauerhaft }}nicht mehr abrufbar{{#if: | , festgestellt im {{#invoke:DateTime|format||F Y}} }}. Suche im Internet Archive ){{#if: | {{#if: | | Vorlage:Toter Link/archivebot }} }} | (Seite {{#switch:|no|0|=|#default=dauerhaft }}nicht mehr abrufbar{{#if: | , festgestellt im {{#invoke:DateTime|format||F Y}} }}.) }}{{#switch: |no|0|= |#default={{#if: || }} }}{{#invoke:TemplatePar|check |opt = inline= url= text= datum= date= archivebot= bot= botlauf= fix-attempted= checked= |cat = Wikipedia:Vorlagenfehler/Vorlage:Toter Link |errNS = 0 |template = Vorlage:Toter Link |format = |preview = 1 }}{{#if: https://dotnettutorials.net/lesson/deep-copy-and-shallow-copy-in-cpp/ | {{#if:{{#invoke:URLutil|isWebURL|https://dotnettutorials.net/lesson/deep-copy-and-shallow-copy-in-cpp/}} || {{#if: || }} }} | {{#if: | {{#if: || }} | {{#if: || }} }} }}{{#if: | {{#if:{{#invoke:DateTime|format||F Y|noerror=1}} || {{#if: || }} }} }}{{#switch: |checked|deadurl|= |#default= {{#if: || }} }}|#default= https://wiki-de.moshellshocker.dns64.de/index.php?title=Wikipedia:Defekte_Weblinks&dwl=https://dotnettutorials.net/lesson/deep-copy-and-shallow-copy-in-cpp/ Die nachstehende Seite ist {{#switch:|no|0|=|dauerhaft }}nicht mehr abrufbar]{{#if: | , festgestellt im {{#invoke:DateTime|format||F Y}} }}. (Suche im Internet Archive. ) {{#if: | {{#if: | | Vorlage:Toter Link/archivebot }} }}Vorlage:Toter Link/Core{{#switch: |no|0|= |#default= {{#if: || }} }}{{#invoke:TemplatePar|check |all = inline= url= |opt = datum= date= archivebot= bot= botlauf= fix-attempted= checked= |cat = Wikipedia:Vorlagenfehler/Vorlage:Toter Link |errNS = 0 |template = Vorlage:Toter Link |format = |preview = 1 }}{{#if: https://dotnettutorials.net/lesson/deep-copy-and-shallow-copy-in-cpp/ | {{#if:{{#invoke:URLutil|isWebURL|https://dotnettutorials.net/lesson/deep-copy-and-shallow-copy-in-cpp/}} || {{#if: || }} }} }}{{#if: | {{#if:{{#invoke:DateTime|format||F Y|noerror=1}} || {{#if: || }} }} }}{{#switch: |checked|deadurl|= |#default= {{#if: || }} }}[https://dotnettutorials.net/lesson/deep-copy-and-shallow-copy-in-cpp/ }} }}}}}}}}}}{{#if:| {{#invoke:Vorlage:Internetquelle|archivBot|stamp={{{archiv-bot}}}|text={{#if:|Vorlage:Webarchiv/archiv-bot}}
}}}}{{#invoke:TemplatePar|check |all= url= titel= |opt= autor= hrsg= format= sprache= titelerg= werk= seiten= datum= abruf= zugriff= abruf-verborgen= archiv-url= archiv-datum= archiv-bot= kommentar= zitat= AT= CH= offline= |cat= {{#ifeq: 0 | 0 | Wikipedia:Vorlagenfehler/Vorlage:Internetquelle}} |template= Vorlage:Internetquelle |format=0 |preview=1 }}</ref> Eine flache Kopie produziert der Compiler mit dem vordefinierten Kopierkonstruktor automatisch. Ist in der Klasse Zeichenkette kein Kopierkonstruktor definiert, der eine tiefe Kopie erstellt, würden nach einer Kopie zwei Objekte einen Zeiger auf denselben Speicherblock haben, da die Adresse einfach kopiert werden würde. Ein Objekt weiß dann aber nicht, ob das andere bereits delete auf dem Speicherblock aufgerufen hat. Sowohl ein Zugriff auf den Speicher als auch ein erneutes delete würden dann zu einem Absturz des Programmes führen. Folgendes Beispiel illustriert dies.
Beispiel in C++ (gekürzt): <syntaxhighlight lang="cpp"> class ZeichenketteF { public:
/*
* Konstruktor mit Parameter.
*
* In der Initialisierungsliste wird der Zeiger m_memory so
* initialisiert, dass er auf den neu reservierten Speicher auf dem
* Heap zeigt.
*/
ZeichenketteF(const char* value) : m_memory(new char[strlen(value) + 1])
{
// Kopiert den String aus value in den reservierten Speicher
strcpy(m_memory, value);
}
/*
* Destruktor.
*/
~ZeichenketteF()
{
// Gibt den im Konstruktor reservierten Speicher wieder frei
delete m_memory;
}
/*
* Kopierkonstruktor.
*
* In der Initialisierungsliste wird der Zeiger rhs.m_memory kopiert,
* aber nicht der Speicherbereich, auf den er zeigt (!).
* Es gibt anschließend zwei Objekte von ZeichenketteF, deren Zeiger
* m_memory auf denselben Speicherbereich zeigen.
*/
ZeichenketteF(const ZeichenketteF& rhs) : m_memory(rhs.m_memory) { }
private:
char* m_memory;
};
void scheitere() {
ZeichenketteF name("Wolfgang");
ZeichenketteF kopie(name);
/* Nun wird eine so genannte flache Kopie erstellt.
* Sowohl name.m_memory als auch kopie.m_memory zeigen nun auf
* denselben Speicher!
*
* Sobald die Funktion scheitere() endet, wird für beide Objekte der
* Destruktor aufgerufen. Der erste gibt den Speicherbereich frei,
* auf den m_memory zeigt; der zweite versucht, denselben Speicher
* nochmals freizugeben, was zu undefiniertem Verhalten führt.
* Das kann z. B. ein Programmabsturz sein.
*/
} </syntaxhighlight>
Kosten tiefer Kopien
Tiefe Kopien können bei komplexen Objekten viel Leistung und Speicher verbrauchen.<ref>{{#if:|{{#iferror: {{#iferror:{{#invoke:Vorlage:FormatDate|Execute}}|}}| |}}}}{{#if:|{{{autor}}}: }}{{#if:|{{#if:Shallow vs. Deep Copying in JavaScript — SitePoint|[{{#invoke:Vorlage:Internetquelle|archivURL|1={{#invoke:URLutil|getNormalized|1={{{archiv-url}}}}}}} {{#invoke:Vorlage:Internetquelle|TitelFormat|titel=Shallow vs. Deep Copying in JavaScript — SitePoint}}]{{#if:| ({{{format}}})}}{{#if:| {{{titelerg}}}{{#invoke:Vorlage:Internetquelle|Endpunkt|titel={{{titelerg}}}}}}}}}|{{#if:https://www.sitepoint.com/shallow-vs-deep-copying-in-javascript/%7C{{#if:{{#invoke:TemplUtl%7Cfaculty%7C}}%7C{{#invoke:Vorlage:Internetquelle%7CTitelFormat%7Ctitel={{#invoke:WLink%7CgetEscapedTitle%7C1=Shallow vs. Deep Copying in JavaScript — SitePoint}}}}|[{{#invoke:URLutil|getNormalized|1=https://www.sitepoint.com/shallow-vs-deep-copying-in-javascript/}} {{#invoke:Vorlage:Internetquelle|TitelFormat|titel={{#invoke:WLink|getEscapedTitle|1=Shallow vs. Deep Copying in JavaScript — SitePoint}}}}]}}{{#if:| ({{{format}}}{{#if:2023-04-12{{#if: 2023-07-27 | {{#if:{{#invoke:TemplUtl|faculty|}}||1}}}}
| )
| {{#if:{{#ifeq:en|de||{{#if:en|1}}}}| ;
| )}}}}}}{{#if:| {{{titelerg}}}{{#invoke:Vorlage:Internetquelle|Endpunkt|titel={{{titelerg}}}}}}}}}}}{{#if:https://www.sitepoint.com/shallow-vs-deep-copying-in-javascript/%7C{{#if:{{#invoke:URLutil%7CisResourceURL%7C1=https://www.sitepoint.com/shallow-vs-deep-copying-in-javascript/}}%7C%7C}}}}{{#if:Shallow vs. Deep Copying in JavaScript — SitePoint|{{#if:{{#invoke:WLink|isValidLinktext|1=Shallow vs. Deep Copying in JavaScript — SitePoint|lines=0}}||}}}}{{#if: | In: {{#invoke:Vorlage:Internetquelle|TitelFormat|titel={{{werk}}}}}}}{{#if: | {{{hrsg}}}{{#if: 2023-04-12|,|{{#if: 2023-07-27 | {{#if:{{#invoke:TemplUtl|faculty|}}||,}}}}}}}}{{#if: 2023-04-12| {{#if:{{#invoke:DateTime|format|2023-04-12|noerror=1}}
|{{#invoke:DateTime|format|2023-04-12|T._Monat JJJJ}}
|{{#invoke:TemplUtl|failure|1=Fehler bei Vorlage:Internetquelle, datum=2023-04-12|class=Zitationswartung}} }}{{#if: |,|{{#if: 2023-07-27 | {{#if:{{#invoke:TemplUtl|faculty|}}||,}}}}}}}}{{#if: | S. {{{seiten}}}{{#if: |,|{{#if: 2023-07-27 | {{#if:{{#invoke:TemplUtl|faculty|}}||,}}}}}}}}{{#if: {{#invoke:TemplUtl|faculty|}}| {{#if:2023-04-12|{{#if:|archiviert|ehemals}}|{{#if:|Archiviert|Ehemals}}}} {{#if:|vom|im}} Vorlage:Referrer{{#if:{{#invoke:TemplUtl|faculty|}}| (nicht mehr online verfügbar)}}{{#if: | am {{#iferror: {{#iferror:{{#invoke:Vorlage:FormatDate|Execute}}|}}|{{{archiv-datum}}}{{#if:529593||(?)}}}}}}{{#if: 2023-07-27|;}}}}{{#if: 2023-07-27| {{#if:2023-04-12{{#invoke:TemplUtl|faculty|}}|abgerufen|Abgerufen}} {{#switch: {{#invoke:Str|len| {{#invoke:DateTime|format| 2023-07-27 |ISO|noerror=1}} }}
|4=im Jahr
|7=im
|10=am
|#default={{#invoke:TemplUtl|failure|1=Fehler bei Vorlage:Internetquelle, abruf=2023-07-27|class=Zitationswartung}} }} {{#invoke:DateTime|format|2023-07-27|T._Monat JJJJ}}
| {{#invoke:TemplUtl|failure|1=Vorlage:Internetquelle | abruf=2026-MM-TT ist Pflichtparameter}} }}{{#if:{{#ifeq:en|de||{{#if:en|1}}}}|{{#if:2023-04-12{{#if: 2023-07-27 | {{#if:{{#invoke:TemplUtl|faculty|}}||1}}}}
| (
| {{#if: | | (}}
}}{{#ifeq:{{#if:en|en|de}}|de||
{{#invoke:Multilingual|format|en|slang=!|split=[%s,]+|shift=m|separator=, }}}}{{#if: |{{#ifeq:{{#if:en|en|de}}|de||, }}{{{kommentar}}}}})}}{{#if: 2023-04-12{{#if: 2023-07-27 | {{#if:{{#invoke:TemplUtl|faculty|}}||1}} }}en|{{#if: |: {{
#if:
| „{{
#ifeq: {{#if:{{#if: {{#invoke:templutl|faculty|}}|de-ch|de}}|{{#if: {{#invoke:templutl|faculty|}}|de-ch|de}}|de}} | de
| Vorlage:Str trim
| {{#invoke:Vorlage:lang|flat}}
}}“
| {{#ifeq: {{#if:{{#if: {{#invoke:templutl|faculty|}}|de-ch|de}}|{{#if: {{#invoke:templutl|faculty|}}|de-ch|de}}|de}} | de
| „Vorlage:Str trim“
| {{#invoke:Text|quote
|1={{#if:
| {{#invoke:Vorlage:lang|flat}}
| {{#invoke:Vorlage:lang|flat}} }}
|2={{#if: {{#invoke:TemplUtl|faculty|}}|de-CH|de}}
|3=1}} }}
}}{{#if:
| (<templatestyles src="Person/styles.css" />{{#if: | : }}{{#if: | , deutsch: „“ }})
| {{#if:
| ({{#if: | , deutsch: „“ }})
| {{#if: | (deutsch: „“) }}
}}
}}{{#if: {{{zitat}}}
| {{#if:
| {{#if: {{{zitat}}}
| Vorlage:": Text= und 1= gleichzeitig, bzw. Pipe zu viel }} }}
| Vorlage:": Text= fehlt }}{{#if: | {{#if: {{#invoke:Text|unstrip|{{{ref}}}}}
| Vorlage:": Ungültiger Wert: ref=
| {{{ref}}} }}
}}|.{{#if:{{#invoke:TemplUtl|faculty|}}|{{#if:||{{#ifeq: | JaKeinHinweis |{{#switch:
|0|=Vorlage:Toter Link/Core{{#if: https://www.sitepoint.com/shallow-vs-deep-copying-in-javascript/ | {{#if: | [5] }} (Seite {{#switch:|no|0|=|dauerhaft }}nicht mehr abrufbar{{#if: | , festgestellt im {{#invoke:DateTime|format||F Y}} }}. Suche im Internet Archive ){{#if: | {{#if: deadurlausgeblendet | | Vorlage:Toter Link/archivebot }} }} | (Seite {{#switch:|no|0|=|#default=dauerhaft }}nicht mehr abrufbar{{#if: | , festgestellt im {{#invoke:DateTime|format||F Y}} }}.) }}{{#switch: |no|0|= |#default={{#if: || }} }}{{#invoke:TemplatePar|check |opt = inline= url= text= datum= date= archivebot= bot= botlauf= fix-attempted= checked= |cat = Wikipedia:Vorlagenfehler/Vorlage:Toter Link |errNS = 0 |template = Vorlage:Toter Link |format = |preview = 1 }}{{#if: https://www.sitepoint.com/shallow-vs-deep-copying-in-javascript/ | {{#if:{{#invoke:URLutil|isWebURL|https://www.sitepoint.com/shallow-vs-deep-copying-in-javascript/}} || {{#if: || }} }} | {{#if: | {{#if: || }} | {{#if: || }} }} }}{{#if: | {{#if:{{#invoke:DateTime|format||F Y|noerror=1}} || {{#if: || }} }} }}{{#switch: deadurl |checked|deadurl|= |#default= {{#if: || }} }}|#default= https://wiki-de.moshellshocker.dns64.de/index.php?title=Wikipedia:Defekte_Weblinks&dwl=https://www.sitepoint.com/shallow-vs-deep-copying-in-javascript/ Die nachstehende Seite ist {{#switch:|no|0|=|dauerhaft }}nicht mehr abrufbar]{{#if: | , festgestellt im {{#invoke:DateTime|format||F Y}} }}. (Suche im Internet Archive. ) {{#if: | {{#if: deadurlausgeblendet | | Vorlage:Toter Link/archivebot }} }}Vorlage:Toter Link/Core{{#switch: |no|0|= |#default= {{#if: || }} }}{{#invoke:TemplatePar|check |all = inline= url= |opt = datum= date= archivebot= bot= botlauf= fix-attempted= checked= |cat = Wikipedia:Vorlagenfehler/Vorlage:Toter Link |errNS = 0 |template = Vorlage:Toter Link |format = |preview = 1 }}{{#if: https://www.sitepoint.com/shallow-vs-deep-copying-in-javascript/ | {{#if:{{#invoke:URLutil|isWebURL|https://www.sitepoint.com/shallow-vs-deep-copying-in-javascript/}} || {{#if: || }} }} }}{{#if: | {{#if:{{#invoke:DateTime|format||F Y|noerror=1}} || {{#if: || }} }} }}{{#switch: deadurl |checked|deadurl|= |#default= {{#if: || }} }}[https://www.sitepoint.com/shallow-vs-deep-copying-in-javascript/ }}|{{#switch: |0|=Vorlage:Toter Link/Core{{#if: https://www.sitepoint.com/shallow-vs-deep-copying-in-javascript/ | {{#if: | [6] }} (Seite {{#switch:|no|0|=|dauerhaft }}nicht mehr abrufbar{{#if: | , festgestellt im {{#invoke:DateTime|format||F Y}} }}. Suche im Internet Archive ){{#if: | {{#if: | | Vorlage:Toter Link/archivebot }} }} | (Seite {{#switch:|no|0|=|#default=dauerhaft }}nicht mehr abrufbar{{#if: | , festgestellt im {{#invoke:DateTime|format||F Y}} }}.) }}{{#switch: |no|0|= |#default={{#if: || }} }}{{#invoke:TemplatePar|check |opt = inline= url= text= datum= date= archivebot= bot= botlauf= fix-attempted= checked= |cat = Wikipedia:Vorlagenfehler/Vorlage:Toter Link |errNS = 0 |template = Vorlage:Toter Link |format = |preview = 1 }}{{#if: https://www.sitepoint.com/shallow-vs-deep-copying-in-javascript/ | {{#if:{{#invoke:URLutil|isWebURL|https://www.sitepoint.com/shallow-vs-deep-copying-in-javascript/}} || {{#if: || }} }} | {{#if: | {{#if: || }} | {{#if: || }} }} }}{{#if: | {{#if:{{#invoke:DateTime|format||F Y|noerror=1}} || {{#if: || }} }} }}{{#switch: |checked|deadurl|= |#default= {{#if: || }} }}|#default= https://wiki-de.moshellshocker.dns64.de/index.php?title=Wikipedia:Defekte_Weblinks&dwl=https://www.sitepoint.com/shallow-vs-deep-copying-in-javascript/ Die nachstehende Seite ist {{#switch:|no|0|=|dauerhaft }}nicht mehr abrufbar]{{#if: | , festgestellt im {{#invoke:DateTime|format||F Y}} }}. (Suche im Internet Archive. ) {{#if: | {{#if: | | Vorlage:Toter Link/archivebot }} }}Vorlage:Toter Link/Core{{#switch: |no|0|= |#default= {{#if: || }} }}{{#invoke:TemplatePar|check |all = inline= url= |opt = datum= date= archivebot= bot= botlauf= fix-attempted= checked= |cat = Wikipedia:Vorlagenfehler/Vorlage:Toter Link |errNS = 0 |template = Vorlage:Toter Link |format = |preview = 1 }}{{#if: https://www.sitepoint.com/shallow-vs-deep-copying-in-javascript/ | {{#if:{{#invoke:URLutil|isWebURL|https://www.sitepoint.com/shallow-vs-deep-copying-in-javascript/}} || {{#if: || }} }} }}{{#if: | {{#if:{{#invoke:DateTime|format||F Y|noerror=1}} || {{#if: || }} }} }}{{#switch: |checked|deadurl|= |#default= {{#if: || }} }}[https://www.sitepoint.com/shallow-vs-deep-copying-in-javascript/ }} }}}}}}}}}}{{#if:| {{#invoke:Vorlage:Internetquelle|archivBot|stamp={{{archiv-bot}}}|text={{#if:|Vorlage:Webarchiv/archiv-bot}}
}}}}{{#invoke:TemplatePar|check |all= url= titel= |opt= autor= hrsg= format= sprache= titelerg= werk= seiten= datum= abruf= zugriff= abruf-verborgen= archiv-url= archiv-datum= archiv-bot= kommentar= zitat= AT= CH= offline= |cat= {{#ifeq: 0 | 0 | Wikipedia:Vorlagenfehler/Vorlage:Internetquelle}} |template= Vorlage:Internetquelle |format=0 |preview=1 }}</ref> Zur Vermeidung unnötiger Last empfehlen sich zwei Varianten der oben dargestellten Kopier-Strategie:
- Ressourcen mittels Referenzzählung in verschiedenen Instanzen gemeinsam zu nutzen; viele Implementierungen der Klasse String machen hiervon Gebrauch.
- konstante Referenzen als Parameter in Funktionen und Methoden zu übernehmen, in all den Fällen, in denen auf Parameter nur lesend zugegriffen wird
Der Kopierkonstruktor selbst zeigt in seinem Prototyp, wie man unnötige tiefe Kopien von Objekten vermeidet, auf die man nur lesend zugreifen muss: Er übernimmt eine konstante Referenz, denn sonst müsste er (implizit) aufgerufen werden, bevor er aufgerufen wird. Die Signatur „Klassenname(const Klassenname&)“ ist auch deshalb typisch.
Siehe auch
Einzelnachweise
<references />
- Wikipedia:Vorlagenfehler/Parameter:URL
- Wikipedia:Vorlagenfehler/Parameter:Linktext
- Wikipedia:Vorlagenfehler/Parameter:Datum
- Wikipedia:Vorlagenfehler/Vorlage:"
- Wikipedia:Weblink offline fix-attempted
- Wikipedia:Vorlagenfehler/Vorlage:Toter Link
- Wikipedia:Vorlagenfehler/Vorlage:Toter Link/URL fehlt
- Objektorientierte Programmierung
- C++
- Programmiersprachelement