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.
};
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
Get help from others!
Recent Questions
Recent Answers
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP