TransWikia.com

Move constructor

Stack Overflow en español Asked on December 16, 2021

Estaba revisando este código y me encontré con algunas lineas que no entiendo , es sobre constructores de movimiento, las dejo marcadas:
¿¿Que quiere decir toda esta linea??

MemoryBlock& operator=(const MemoryBlock& other) //¿¿Que quiere decir toda esta linea??
   {
      std::cout << "In operator=(const MemoryBlock&). length = "
                << other._length << ". Copying resource." << std::endl;

      if (this != &other)//¿¿¿que hace esta linea???
      {
         // Free the existing resource.
         delete[] _data;

         _length = other._length;
         _data = new int[_length];
         std::copy(other._data, other._data + _length, _data);
      }
      return *this;
   }

   // Retrieves the length of the data resource.
   size_t Length() const
   {
      return _length;
   }

private:
   size_t _length; // The length of the resource.
   int* _data; // The resource.
};

2 Answers

En C++, todas las funciones se ajustan a este protocolo:

TipoDevuelto nombre( Argumentos ... )

Por lo tanto

MemoryBlock& operator=(const MemoryBlock& other)

es la definición de una funcióm-biembro que devuelve una referencia a una instancia del tipo MemoryBlock, cuyo nombre es operator=, y requiere como argumento una referencia constante a una instancia del tipo MemoryBlock.

Mientras que esta otra línea

this != &other

es una simple comparación, en donde se comprueba que el valor de this sea distinto a la dirección de memoria en la que existe el argumento other. Vamos, viene a comprobar que no estas llamando a la función usando la misma instancia como argumento.

Así que, como verás, de move constructor nada de nada :-)

Answered by Trauma on December 16, 2021

MemoryBlock& operator=(const MemoryBlock& other) //¿¿Que quiere decir toda esta linea??

Aqui estas sobreescribiendo el operador de asignacion =. Este es el que dicta como se va a copiar el objeto cuando hagas algo como A = B.

if (this != &other)//¿¿¿que hace esta linea???

Estas revisando que no asignes el objeto a si mismo. this es el puntero de tu objeto. Y &other es el puntero a el otro. Si ambos son iguales entoces estas haciendo algo como A = A. Si no pones ese checkeo de seguridad cuando corra la copia vas a borrar el objeto y crear uno nuevo.

 delete[] _data; // Borras los datos que tenias

 _length = other._length; 
 _data = new int[_length]; // Reasignas el objeto
 std::copy(other._data, other._data + _length, _data); // Y le asignas datos inexistentes al objeto.

Answered by Pablochaches on December 16, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP