Aprendí que nunca puedo acceder a una variable privada, solo con una función get en la clase. Pero entonces, ¿por qué puedo acceder a él en el constructor de copias?
Ejemplo:
Field::Field(const Field& f)
{
pFirst = new T[f.capacity()];
pLast = pFirst + (f.pLast - f.pFirst);
pEnd = pFirst + (f.pEnd - f.pFirst);
std::copy(f.pFirst, f.pLast, pFirst);
}
Mi declaración:
private:
T *pFirst,*pLast,*pEnd;
c++
private
access-specifier
Rey Demonio
fuente
fuente
const&
getter público o por valor para cada uno? Entonces solo son 'escritura-privados', & para los valores desperdician recursos y fallan para los miembros que no se pueden copiar.) Estoy desconcertado por el éxito de una pregunta tan vacía, preguntando sobre la construcción de copias mientras ignora totalmente lo que significa, y ninguna respuesta usa la lógica básica para desacreditarla. Explican tecnicismos secos, pero hay una respuesta mucho más simple a una pregunta así de ciegaRespuestas:
En mi humilde opinión, las respuestas existentes no hacen un buen trabajo al explicar el "por qué" de esto, centrándose demasiado en reiterar qué comportamiento es válido. "Los modificadores de acceso funcionan a nivel de clase y no a nivel de objeto". - ¿si, pero por qué?
El concepto general aquí es que son los programadores que diseñan, escriben y mantienen una clase los que se espera que comprendan la encapsulación OO deseada y estén capacitados para coordinar su implementación. Entonces, si está escribiendo
class X
, está codificando no solo cómo unX x
objeto individual puede ser utilizado por código con acceso a él, sino también cómo:X
objetos distintos cooperan para proporcionar comportamientos previstos mientras respetan las condiciones posteriores y las invariantes de su diseño.Tampoco es solo el constructor de copia; muchas operaciones pueden involucrar dos o más instancias de su clase: si está comparando, sumando / multiplicando / dividiendo, copiando-construyendo, clonando, asignando, etc., entonces a menudo es el caso que usted o simplemente debe tener acceso a datos privados y / o protegidos en el otro objeto, o quiere que permita una implementación de función más simple, rápida o generalmente mejor.
Específicamente, estas operaciones pueden querer aprovechar el acceso privilegiado para hacer cosas como:
shared_ptr
s para datos de referencia, etc.auto_ptr<>
"traslada" la propiedad al objeto en construcciónunordered_map
miembro pero solo exponerbegin()
eend()
iteradores públicamente - con acceso directo asize()
sureserve
capacidad de copia más rápida; peor aún si solo exponenat()
yinsert()
y de lo contrariothrow
....fuente
this == other
cada vez que accede aother.x
cuál tendría que hacerlo si los modificadores de acceso funcionaran a nivel de objeto.this == other
cada vez que accedesother.x
" - pierde el sentido - siother.x
solo se aceptara en tiempo de ejecución cuando es equivalente athis.x
, no habría mucha escritura de punteroother.x
en primer lugar; el compilador también podría obligarlo a escribirif (this == other) ...this.x...
para lo que fuera a hacer. Su concepción de "conveniencia (incluso más si las variables privadas fueran públicas)" también pierde el sentido: la forma en que se define el Estándar es lo suficientemente restrictiva como para permitir una encapsulación adecuada , pero no innecesariamente inconveniente.Los modificadores de acceso funcionan a nivel de clase y no a nivel de objeto .
Es decir, dos objetos de la misma clase pueden acceder a los datos privados del otro.
Por qué:
Principalmente debido a la eficiencia. Sería una sobrecarga de tiempo de ejecución no despreciable comprobar si
this == other
cada vez que accedeother.x
lo que tendría que hacer, los modificadores de acceso funcionaron a nivel de objeto.También es algo semánticamente lógico si lo piensas en términos de alcance: "¿Qué parte del código debo tener en cuenta al modificar una variable privada?" - Debe tener en cuenta el código de toda la clase, y esto es ortogonal a qué objetos existen en tiempo de ejecución.
Y es increíblemente conveniente al escribir constructores de copia y operadores de asignación.
fuente
Puede acceder a miembros privados de una clase desde dentro de la clase, incluso a los de otra instancia.
fuente
Para comprender la respuesta, me gustaría recordarles algunos conceptos.
this
El puntero se pasa a cada función cuando se llama.Ahora es por el
this
puntero, la función puede localizar variables de esa instancia en particular. no importa si es privado o público. se puede acceder dentro de esa función. Ahora si pasamos un puntero a otro objeto de la misma clase. usando este segundo puntero podremos acceder a miembros privados.Espero que esto responda a su pregunta.
fuente
El constructor de copia es una función miembro de la clase y, como tal, tiene acceso a los miembros de datos de la clase, incluso aquellos declarados como 'privados'.
fuente