Explicación detallada de C este puntero
Como se mencionó anteriormente, cada miembro de datos de un objeto ocupa un espacio de almacenamiento separado. Si se definen n objetos para la misma clase, habrá n conjuntos de espacios del mismo tamaño para almacenar n objetos. miembros. Sin embargo, diferentes objetos llamarán al mismo segmento de código de función.
Entonces, cuando una función miembro de un objeto diferente hace referencia a un miembro de datos, ¿cómo se determina que la referencia es a un miembro de datos del objeto especificado?
Si a.volume() está presente, debe hacer referencia a la altura, el ancho y el largo del objeto a para calcular el volumen del rectángulo a.
Si b.volume() está presente, entonces debe hacer referencia a la altura, el ancho y el largo en el objeto b para calcular el volumen del rectángulo b.
Ahora que se utiliza el mismo segmento de función, ¿cómo le permite el sistema hacer referencia a los miembros de datos en aob respectivamente? Cada función miembro contiene un puntero especial con un nombre fijo, llamado este puntero. Es un puntero a un objeto de esta clase y su valor es la dirección inicial del objeto donde se encuentra la función miembro actualmente llamada.
Por ejemplo, al llamar a la función miembro a.volume, el sistema de compilación asignará la dirección inicial del objeto a a este puntero, de modo que cuando la función miembro haga referencia al miembro de datos, se encontrará de acuerdo con el punto de este puntero Miembros de datos del objeto a. Por ejemplo, la función de volumen calcula el valor de alto*ancho*largo y realmente ejecuta:
(this-gt;alto)*(this-gt;ancho)*(this-gt;largo)
Debido a que esto apunta a a en este momento, equivale a ejecutar:
(a.height)*(a.width)*( a.length)
De esta manera se calcula el volumen del rectángulo a.
De manera similar, si b.volume() existe, el sistema de compilación asignará la dirección inicial del objeto b al puntero this de la función miembro volumen, que obviamente está calculando el volumen del rectángulo b.
Inicialmente, el volumen de la función miembro se define de la siguiente manera:
int Box::volume()
{
return (altura *ancho *largo);
}
C lo trata como
int Box: .volume(Box *this)
{
return (this-gt; height * this-gt; width * this-gt; length
}
Es decir, estará en); el miembro Agrega un puntero a this a la lista de parámetros formales de la función.
Cuando se llama a una función miembro, en realidad se llama de la siguiente manera:
a.volume(amp; a);
Cambiar la dirección de objeto a Pasado al parámetro formal este puntero. Luego hace referencia al otro miembro señalado por este puntero.
Nota: Todo esto lo hace automáticamente el sistema de compilación, por lo que el programador no tiene que agregar manualmente este puntero al parámetro formal ni pasar la dirección del objeto a a este puntero. También puede utilizar este puntero explícitamente cuando sea necesario.
Por ejemplo, en la función de volumen de la clase de caja, los dos métodos de representación siguientes son legales y equivalentes.
return (alto * ancho * largo); //implícitamente usa este puntero
retorno (this-gt; alto * this-gt; ancho * this-gt; largo) ; // usa explícitamente el puntero this
Puedes usar *this para representar el objeto donde se encuentra la función miembro llamada, y *this es el objeto al que apunta, es decir, el objeto actual.
Por ejemplo, en el cuerpo de la función miembro a.volume(), si aparece *this, es el objeto actual a. La declaración de retorno anterior también se puede escribir como
return((*this).height * (*this).width * (*this).length);
Tenga en cuenta que * this Los paréntesis no se pueden omitir ni se pueden escribir como *this.
La llamada "función miembro que llama f del objeto a" en realidad accede a los miembros del objeto a apuntando el puntero this al objeto a cuando llama a la función miembro f.