Tilldelningsoperatören i programmeringsspråket C++ betecknas med '='-tecknet. Liksom andra operatörer i C++ kan den överbelastas med .
Kopieringsoperationen är en speciell typ av tilldelningsoperation som används för att tilldela objekt av samma klass till varandra. Det är en av specialfunktionsmedlemmarna och genereras automatiskt av kompilatorn om det inte finns någon explicit deklaration från programmeraren. Koden som genereras av kompilatorn gör en bitvis kopia.
Operatören för kopieringstilldelning skiljer sig från kopieringskonstruktören genom att den måste rensa upp datamedlemmarna för uppdragets mål (och hantera självtilldelning på rätt sätt), medan kopieringskonstruktorn tilldelar värden till oinitierade datamedlemmar. [1] Till exempel:
My_Array först ; // initiering med standardkonstruktorn My_Array second = first ; // initiering med kopia konstruktor andra = första ; // tilldelning genom kopiering tilldelning operationSom ett specialfall bör följande variant av initiering av kopieringskonstruktören noteras:
My_Array second = My_Array ();I det här fallet utför kompilatorn (till exempel VC2013) omedelbart, utan några optimeringsalternativ, returvärdeoptimering (RVO, returvärdesoptimering) och kopieringskonstruktorn anropas inte.
När det gäller att göra djupa kopior av objekt måste även undantagshantering beaktas . Ett sätt att undvika resursflyttningsfelet är följande:
Men om en framgångsrik utbytesmetod är tillgänglig för alla medlemmar och klassen implementerar en kopieringskonstruktör och en destruktor (enligt regeln om tre ), skulle det kortaste sättet att implementera en kopieringsuppgift vara [2] :
offentliga : void swap ( My_Array & other ) // swap member funktion (bör inte misslyckas!) { // swap alla medlemmar (och underliggande sub-objekt om möjligt) med andra std :: swap ( array , other . array ); std :: swap ( count , other . count ); } My_Array & operator = ( My_Array other ) // Notera: argumentet skickas av värde! { // swap this with other swap ( other ); // returnerar alltid *this return * this ; // annat är förstört, frigör minne }Anledningen till att operationen =återvänder My_Array&istället för voidär enkel. Det är tillåtet att kombinera uppdrag som:
array_1 = array_2 = array_3 ; // värdet av array_3 tilldelas array_2 // sedan tilldelas värdet av array_2 till array_1