¿Puede un metodo acceder directamente a miembros no publicos de otras instancias de la misma clase?

0
0

Sí.

El nombre this no es especial. El acceso es concedido o denegado en base a la referencia/puntero/objeto de la clase, no en base al nombre de la referencia/puntero/objeto. (Véase más abajo la letra pequeña.)

En efecto, C++ permite que sus métodos y funciones amigas a accedan a las partes no públicas de todos sus objetos, no sólo al objeto this, parece en un principio que debilita la encapsulación. Sin embargo es todo lo contrario: esta norma mantiene la encapsulación. He aquí por qué.

Sin esta regla, la mayoría de los miembros no públicos necesitarían un método get que sea público, ya que muchas clases tienen al menos un método o una función amiga que tiene un argumento explícito (es decir, un argumento que no es this) de su propia clase.

¿que? (usted se preguntará). Bueno, vamos a elaborar un ejemplo:

Considere la posibilidad de operador de asignación Algo::operator=(const Algo &x). Este operador de asignación, probablemente cambiará los miembros de datos del argumento de la izquierda, *this, sobre la base de los miembros de datos en el argumento de la derecha, x. Sin la regla C++ que se debate aquí, la única manera para que el operador de asignación acceda a los miembros no públicos de x sería que la clase Algo tuviera un método público get para cada dato no público. Eso sería un asco.

El operador de asignación no es el único que podría debilitar la encapsulación de no ser por esta regla. He aquí una lista parcial de los demás (!):

  • Constructor que recibe como parámetro una instancia de la misma clase (Constructor copia)
  • Los operadores de comparación: ==, =, <=, <,> =,>.
  • Los operadores binarios aritméticos: x + y, x – y , x * y, x / y, x % y.
  • Los operadores binarios: x ^ y, x + y, x | y.
  • Métodos estáticos que aceptan una instancia de la misma clase como parámetro.
  • Los métodos estáticos que crean/manipulan una instancia de la misma clase.
  • etc.

Conclusión: La encapsulación sería un desastre sin esta regla beneficiosa: la mayoría de los miembros no públicos de la mayoría de las clases terminarían teniendo método público get.

La letra pequeña: Hay otra regla que está relacionado con lo anterior: métodos y funciones amigas de una clase derivada pueden tener acceso a los miembros protegidos de cualquiera de sus propios objetos (los objetos de su clase o cualquier clase derivada de su clase), pero no para otros. Se ve un poco opaco, he aquí un ejemplo: supongamos que las clases D1 y D2 heredan directamente de la clase B, y clase B tiene un miembro protegido x. El compilador dará a los miembros y funciones amigas de D1 acceso directamente a los miembros de x de cualquier objeto que sabe que es un D1, como por ejemplo a través de un puntero D1*, una referencia &D1, un objeto D1, etc., sin embargo, el compilador dará un error al momento de compilar si un miembro D1 o una función amiga trata de acceder directamente a los miembros de x de cualquier cosa que no sea por lo menos un D1, como por ejemplo a través de un puntero B*, referencia &B, un objeto B, un puntero *D2, una referencia &D2, un objeto D2, etc., A modo de una analogía (imperfecta!!), a usted se le permite buscar en su propio bolsillo, pero no se le permite buscar en los bolsillos de tu padre, ni los bolsillos de tu hermano.

 

/*Tomado de C++ FAQ Lite*/

  • You must to post comments
An error occurred while importing content. Error: Class HTML_QuickForm_text does not have a constructor, so you cannot pass any constructor arguments