El 14 de septiembre de 2017, publicamos una versión revisada de nuestra Política de privacidad. Tu uso continuado de video2brain.com significa que aceptas este documento revisado, por lo que te recomendamos que dediques unos minutos a leerlo y comprenderlo.

C++: Semántica de movimiento

Cómo crear un constructor de movimiento

Prueba ahora LinkedIn Learning sin cargo y sin compromiso.

Prueba gratis Mostrar modalidades de suscripción
Ahora que ya sabemos para qué sirve la semántica de movimiento, lo que queremos hacer es empezar a usarla en nuestras clases. Para ello necesitamos un constructor de movimiento. Veremos con un ejemplo cómo definirlo.
05:60

Transcripción

Para poder aprovechar las ventajas de la semántica de movimiento en una de tus propias clases necesitas crear un constructor de movimiento. Aquí tengo una copia de "rational-01.cpp". Es una clase muy sencilla para trabajar con números racionales. Esta clase incluye instrucciones "print" muy útiles, para mostrar donde se llama a su constructores y destructores. Aquí los puedes ver. Ahí está el constructor por defecto. Hay un constructor "int", un constructor "intint", un constructor de copia y nuestro destructor. Esto nos ayuda a ver que está pasando. Cuando lo compilo y ejecuto puedes ver aquí en el "main" que estoy creando algunos números racionales. Hago algunos cálculos con ellos y los saco por pantalla. Puedes ver donde se llama a mis constructores. Y aquí al final tengo las llamadas a cinco destructores. Seguimos adelante y añadimos un constructor de movimiento y vemos que aspecto tiene. Me voy hacia arriba, y aquí donde tengo mi constructor de copia inserto otro justo debajo. Aquí puedes ver el "doble ampersand". Eso quiere decir que el argumento va a ser un "rvalue". Esto es lo que hace que sea un constructor de movimiento. También puedes ver que aquí pongo "no except", así. Esto en realidad es una macro. Normalmente sólo sería esta palabra clave: "no except", así. Por desgracia, Microsoft visual C++ no admite todavía esa palabra clave. Lo hará en la siguiente versión. Estoy usando la versión 18 que es la última en estos momentos. Necesito decidir aquí esta macro. Eso hará que funcione con el mismo código tanto en Microsoft, como en otros sistemas operativos. Aquí puedes ver que tenemos el "no except". Este modificador "no except", en realidad se necesita en el reconstructor de movimiento. Evita las excepciones que se generan al dejar el objeto en un estado desconocido. Tu compilador podría ignorar en realidad el constructor de movimiento si no se declara con "no except". Así que necesitamos tenerlo. Seguimos adelante y escribimos el código para esto. Lo vamos a poner justo aquí. Vamos a poner el "no except". Ahí está. Lo primero que vamos a hacer es mover el numerador y el denominador. El numerador es ese "_n". Voy a utilizar "move" estándar para mover de "rhs" a nuestro "_n". Voy a hacer lo mismo con "_d" para el denominador. Después, voy a llamar a "reset" el "right hand sight". Voy a utilizar el estándar "move" para mover de "right hand sight" a nuestro "_n". Voy a hacer lo mismo con "_d" para el denominador. Después, voy a llamar a "reset and rigth hand sight" Todo lo que hace esto es dejar las cosas en un estado conocido. Esta es una parte importante de un constructor de movimiento. Después de mover los datos fuera del origen tienes que asegurarte de que dejas la fuente en un estado por defecto que tenga sentido. Aquí se hace eso en "rigth hand sight". Después voy a sacar un mensaje diciendo que he llamado a nuestro constructor de movimiento. Obviamente no necesitas poner esto en producción, pero nos ayuda a ver cuando se ha utilizado el constructor de movimiento. Ahora compilo y ejecuto. Puedes ver que todavía no se ha llamado al nuestro constructor de movimiento. Necesitamos hacer algo realmente sobre un "rvalue" para que se haga la llamada. Así que voy a tomar este "d", y voy a llamar al "move" estándar pasandole "c". Eso debería ser nuestro constructor de movimiento. Ahora puedes ver que se llama a nuestro constructor de movimiento y que "c" se deja vacío, "cero partido por uno". Obviamente no puedo hacerlo "cero partido por cero" porque no sería un número válido, ¿ no?. Esa es la razón por la que tengo mi pequeño "reset" aquí, que lo deja en un estado lógico. Un denominador "cero" no es valido porqué no puedes dividir por cero. Así que se puede llamar automáticamente al constructor de movimiento en algunas circunstancias. Por ejemplo si tengo una función que toma un objeto racional y devuelve ese objeto racional. Después voy aquí abajo y pongo "f" y entre paréntesis "c". Compilo y ejecuto. Puedes ver que tiene "d". Se está utilizando un constructor de copia y uno de movimiento. Así que cuanto se llama a "f" se utiliza el constructor de copia para crear ese nuevo objeto. Pero porque el objeto que se devuelve es un objeto temporal sin ningún nombre real. Así que cuanto la función no devuelve aquí en esta asignación ese es un objeto temporal sin nombre. Por lo que es automáticamente un "rvalue". Así que se llama al constructor de movimiento. Tenemos un constructor de movimiento "d" que en realidad es una copia de "c". Porque se ha llamado el constructor de copia cuando se llama a la función. Y así "c" no se deja vacío. Pero lo que ha pasado es que hemos guardado una copia. Ahora hay una copia menos de las que habría habido si no hubiésemos implementado nuestro constructor de movimiento. Por eso, tener un constructor de movimiento es un factor importante al admitir la semántica de movimiento. Veremos más formas de admitir la semántica de movimiento a medida que avancemos en este capítulo.

C++: Semántica de movimiento

Profundiza en C++ con la semántica de movimiento, lo que permite optimizar la transferencia de datos, un componente fundamental de la gestión de recursos en C++.

28 min (8 Videos)
Actualmente no hay comentarios.
 
Software:
Fecha de publicación:13/12/2016

Este curso video2brain está disponible como descarga y para ser visualizado online. ¡Pero no hace falta que decidas entre las dos opciones! Al comprar el curso, disfrutarás de ambas posibilidades.

La descarga te permite ver las lecciones sin estar conectado/a a internet y supone una navegación fácil y ágil entre capítulo y capítulo. Si vas a trabajar en diferentes ordenadores o si no quieres descargarte el curso completo, entra en la web con tus datos de acceso y disfruta directamente de tus vídeos online. Te deseamos que disfrutes de este curso y te resulte de mucha utilidad.

Estamos a tu disposición si tienes cualquier tipo de duda o pregunta.