1) ¿Cómo el puntero this es diferente de otros punteros? Según tengo entendido, los punteros apuntan a la memoria en el montón. ¿Eso significa que los objetos siempre se construyen en el montón, dado que hay un puntero hacia ellos?

2) ¿Podemos robar el puntero this en el constructor de movimiento o la asignación de movimiento?

0
user6386155 9 may. 2019 a las 17:16

3 respuestas

La mejor respuesta

¿Cómo este puntero es diferente de otros punteros?

El puntero this solo existe en el contexto de una función de miembro que no sea static clase. También está implícito, su nombre es una palabra clave reservada y siempre es una expresión de prvalue. De lo contrario, es lo mismo que cualquier otro puntero.

Según tengo entendido, los punteros apuntan a la memoria en el montón.

Los punteros pueden apuntar a cualquier cosa en la memoria. No se limita al montón y tampoco lo son objetos.

¿Podemos robar este puntero en mover constructor o mover asignación?

this es siempre una expresión prvalue. No es posible asignarle una nueva dirección más de lo que podría asignarle un nuevo valor a 5. El hecho es que los objetos existen en un lugar en la memoria durante toda su vida. Su dirección nunca puede cambiar y sería ilógico intentar cambiar eso asignando una nueva dirección a this. Al moverse de un objeto, se mueve el valor o estado que el objeto tiene en otro lugar, pero el objeto en sí mismo todavía existe en su dirección anterior.

7
François Andrieux 9 may. 2019 a las 14:31

¿Cómo este puntero es diferente de otros punteros?

this no es diferente de otros punteros, excepto que no puede cambiar su valor y que solo existe dentro de las funciones miembro. Es una palabra clave reservada.

Según tengo entendido, los punteros apuntan a la memoria en el montón. ¿Eso significa que los objetos siempre se construyen en el montón, dado que hay un puntero hacia ellos?

No, los punteros (válidos o no válidos) pueden apuntar "a cualquier parte". No, las estructuras / clases se pueden asignar a cualquier lugar. En la tienda automática (pila), en la tienda gratuita (montón), en otro lugar si la plataforma lo admite.

¿Podemos robar este puntero en mover constructor o mover asignación?

No estoy exactamente seguro de lo que está preguntando, pero la respuesta es probablemente no.

7
Swordfish 9 may. 2019 a las 14:49

1) ¿En qué se diferencia este puntero de otros punteros?

this es una palabra clave. No puede y no necesita ser declarado. this está implícitamente disponible en funciones miembro no estáticas. this se refiere al argumento de instancia de la función miembro.

Por el contrario, las variables de puntero pueden y generalmente deben declararse. Un ejemplo de una declaración de puntero:

void* ptr = nullptr;

Según tengo entendido, los punteros apuntan a la memoria en el montón.

1

¿Eso significa que los objetos siempre se construyen en el montón

1

void foo() {
    int i;
    int* iptr = &i;
}

1 1


2) ¿Podemos robar este puntero en mover constructor o mover asignación?

Depende de lo que quieras decir con "robar". Pero probablemente no.


1

2
eerorika 9 may. 2019 a las 14:44