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 xobjeto individual puede ser utilizado por código con acceso a él, sino también cómo:Xobjetos 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_ptrs para datos de referencia, etc.auto_ptr<>"traslada" la propiedad al objeto en construcciónunordered_mapmiembro pero solo exponerbegin()eend()iteradores públicamente - con acceso directo asize()sureservecapacidad de copia más rápida; peor aún si solo exponenat()yinsert()y de lo contrariothrow....fuente
this == othercada vez que accede aother.xcuál tendría que hacerlo si los modificadores de acceso funcionaran a nivel de objeto.this == othercada vez que accedesother.x" - pierde el sentido - siother.xsolo se aceptara en tiempo de ejecución cuando es equivalente athis.x, no habría mucha escritura de punteroother.xen 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 == othercada vez que accedeother.xlo 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.
thisEl puntero se pasa a cada función cuando se llama.Ahora es por el
thispuntero, 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