Operator przypisania ruchu

W języku programowania C++ operator przypisania ruchu = służy do przenoszenia tymczasowego obiektu do istniejącego obiektu. Operator przypisania przenoszenia, podobnie jak większość operatorów języka C++, może być przeciążony . Podobnie jak operator przypisania kopiowania, jest to specjalna funkcja członkowska .

Jeśli operator przypisania przenoszenia nie jest jawnie zdefiniowany, kompilator generuje niejawny operator przypisania przenoszenia ( C++11 i nowsze), pod warunkiem, że konstruktory kopiowania / przenoszenia , operator przypisania kopiowania lub destruktory nie zostały zadeklarowane. Parametrem operatora przypisania przenoszenia jest odwołanie do wartości r (T&&) do typu T , gdzie T jest obiektem definiującym operator przypisania przenoszenia. Operator przypisania przenoszenia różni się od konstruktora przenoszenia, ponieważ operator przypisania przenoszenia jest wywoływany na istniejącym obiekcie, podczas gdy konstruktor przenoszenia jest wywoływany na obiekcie utworzonym przez operację. Następnie dane drugiego obiektu nie są już ważne.

Przeciążenie operatora przypisania ruchu

Aby przeciążyć operator przypisania ruchu, sygnatura funkcji musi mieć postać:

   T  &  operator  =  (  T  &&  dane  ) 

Aby pomyślnie przeciążyć operator przypisania przenoszenia, muszą być spełnione następujące warunki:

  • Sprawdź, czy obiekt wywołujący operatora nie wywołuje samego operatora.
  • Przydział danych bieżącego obiektu jest cofnięty.
  • Obiekt, z którego jest przenoszony, musi mieć swoje dane oznaczone jako nullptr (lub coś, co oznaczałoby przeniesienie)
  • Operator musi zwrócić odwołanie do „*to”.

Rozważmy następujący operator przypisania przenoszenia dla prostej klasy ciągów znaków:

  
 
      
    
        
         
         class  String  {  public  :  String  &  operator  =  (  String  &&  other  )  noexcept  {  // Jeśli nie próbujemy przenieść obiektu do siebie...  if  (  this  !=  &  other  )  {  delete  []  this  ->  data_  ;  // Uwolnij oryginalne dane tego łańcucha.  this  ->  data_  =  inny  .   
          
    
     
  

 
   
 dane_  ;  // Skopiuj wskaźnik danych drugiego ciągu do tego ciągu.  inny  .  data_  =  nullptr  ;  // Na koniec zresetuj wskaźnik danych drugiego łańcucha.  }  zwróć  *  to  ;  }  prywatne  :  znak  *  dane_  ;  }; 
  1. ^ a b „Operator przypisania przenoszenia - cppreference.com” . en.cppreference.com . Źródło 2016-02-23 .
  2. ^ „Konstruktory przenoszenia i operatory przypisania przenoszenia (C++)” . msdn.microsoft.com . Źródło 2016-02-23 .