2011-11-24 19 views
5

decir que tengo una clase FooC++ de referencias entre un puntero a

class Foo { 
} 

debo hacer asignaciones siguientes:

Foo *ptrFoo=new Foo(); 

Foo &ref=*(ptrFoo); //question 1 
Foo afoo=*(ptrFoo); //quesion 2 

Mis preguntas:

1) Cuando assignming a "& ref" ¿Qué ocurre internamente en términos de memoria? ¿Simplemente está asignando la dirección de memoria de "ptrFoo" a "ref"?

2) Al asignar a "afoo", ¿qué ocurre? ¿Llama a copy-constructor? ¿Eso significa que la memoria está asignada para dos objetos Foo? es decir, "afoo" y memoria previamente asignada para "ptrFoo"?

3) Decir que tengo un método llamado "vacío methodBar (const Foo & ejemplo)" Si paso "ptrFoo" como:

methodBar ((* preFoo));

¿cuál es el significado de "const" aquí?

Respuesta

8

1) Al asignar a "& ref" ¿qué ocurre internamente en términos de la memoria? ¿Simplemente está asignando la dirección de memoria de "ptrFoo" a "ref"?

Eso depende de la plataforma, el compilador y la configuración del compilador. Su compilador puede generar un sinónimo para la desreferenciación. Debido a que una referencia no puede ser redefinida, no hay ninguna razón por la que un compilador realmente necesite asignar memoria para la variable.

2) Al asignar a "afoo", ¿qué ocurre? ¿Llama a copy-constructor? ¿Eso significa que la memoria está asignada para dos objetos Foo? es decir, "afoo" y memoria previamente asignada para "ptrFoo"?

Sí, el contenido de la Foo almacenado en el almacenamiento dinámico se copian (utilizando el constructor de copia) a la instancia de Foo en el almacenamiento automático. No hay asignación dinámica pasando aquí; la instancia aFoo se crearía igual de simple si no hubiera una asignación. Por ejemplo, Foo aFoo;.

3) Decir que tengo un método llamado "vacío methodBar (const Foo & ejemplo)" Si paso "ptrFoo" como: methodBar ((* preFoo)); ¿cuál es el significado de "const" aquí?

const en esa posición significa que mientras el artículo se pasa por referencia, no se permite que el método que se declaró que la referencia const para modificar la instancia las referencias de referencia.

4
  1. Al hacer Foo& ref = *ptrFoo;, que están haciendo una referencia a *ptrFoo. Solo existe un Foo en este momento. Cualquier cambio que realice en ref o *ptrFoo afectará al mismo objeto.

  2. Al hacer Foo afoo = *ptrFoo; (que es la misma que Foo afoo = ref;), se crea otra separadaFoo, que existe independientemente de *ptrFoo. Es inicializado por el constructor de copia Foo. Tenga en cuenta que afoo existe en la pila pero *ptrFoo en la tienda gratuita (montón). Cualquier cambio que realice en *ptrFoo no afectará a afoo, y viceversa. También tenga en cuenta que afoo serán destruidos y su memoria liberada automáticamente cuando se sale del ámbito, pero *ptrFoo debe ser destruido y su memoria liberada explícitamente por hacer delete ptrFoo;

  3. El const en este caso significa que la función acepta una referencia a un Foo que promete no modificar. No puede llamar a ningún método en ese Foo que no esté marcado como const. Además, cuando llama a esta función, no se crea un nuevo Foo (es decir, no se pasa por valor).

2

1) Se trata de crear una referencia al objeto apuntado por ptrFoo, no se crea ningún nuevo objeto.

2) Se llama al constructor de copia y está creando un nuevo objeto de tipo Foo.

3) El const significa que está pasando una referencia a un objeto cuyos datos no se deben modificar.

2

1) Asigna la dirección de memoria del objeto devuelto por *(ptrFoo), que equivale a ptrFoo.

2) Se llama al constructor de copia. Ahora tiene dos objetos, uno que está asignado en el montón y apunta por ptrFoo y otro que está asignado en la pila y se llama afoo.

3) El const significa que el método methodBar no puede modificar el objeto al que hace referencia la Foo& llamado instance. Solo se permitirá llamar a métodos en Foo que también estén marcados como const.

Cuestiones relacionadas