Flytta uppdragsoperatör

I programmeringsspråket C++ används move assignment operator = för att överföra ett temporärt objekt till ett befintligt objekt . Flytttilldelningsoperatorn, som de flesta C++-operatorer, kan överbelastas . Liksom operatören för kopieringsuppdrag är det en speciell medlemsfunktion .

Om flytttilldelningsoperatorn inte är explicit definierad, genererar kompilatorn en implicit flytttilldelningsoperator ( C++11 och nyare) förutsatt att kopiera / flytta konstruktörer , kopieringstilldelningsoperator eller destruktörer inte har deklarerats. Parametern för en flytttilldelningsoperator är en rvalue-referens (T&&) till typen T , där T är objektet som definierar flytttilldelningsoperatorn. Flytttilldelningsoperatorn är annorlunda än en flyttkonstruktor eftersom en flytttilldelningsoperator anropas på ett befintligt objekt, medan en flyttkonstruktor anropas på ett objekt som skapats av operationen. Därefter är det andra objektets data inte längre giltiga.

Överbelastning rörelseuppdrag operatör

För att överbelasta flytttilldelningsoperatören måste signaturen för funktionen vara:

   T  &  operator  =  (  T  &&  data  ) 

För att lyckas överbelasta flytttilldelningsoperatören måste följande villkor vara uppfyllda:

  • Kontrollera om objektet som ringer operatören inte ringer operatören på sig själv.
  • Det aktuella objektets data avallokeras.
  • Objektet som flyttas från måste ha sin data märkt som nullptr (eller något som betecknar flytten)
  • Operatören måste returnera en referens till "*detta".

Tänk på följande flytttilldelningsoperator för en enkel strängklass:

  
 
      
    
        
         
          
          
    
     
  

 
   
 class  String  {  public  :  String  &  operator  =  (  String  &&  other  )  noexcept  {  // Om vi ​​inte försöker flytta objektet in i sig självt...  if  (  this  !=  &  other  )  {  delete  []  this  ->  data_  ;  // Frigör denna strängs ursprungliga data.  detta  ->  data_  =  annat  .  data_  ;  // Kopiera den andra strängens datapekare till denna sträng.  annat  .  data_  =  nullptr  ;  // Återställ slutligen den andra strängens datapekare.  }  returnera  *  detta  ;  }  privat  :  char  *  data_  ;  }; 
  1. ^ a b "Flytta uppdragsoperatör - cppreference.com" . en.cppreference.com . Hämtad 2016-02-23 .
  2. ^ "Förflyttningskonstruktörer och flyttuppdragsoperatörer (C++)" . msdn.microsoft.com . Hämtad 2016-02-23 .