Aprendi que nunca posso acessar uma variável privada, apenas com uma função get na classe. Mas então por que posso acessá-lo no construtor de cópia?
Exemplo:
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);
}
Minha declaração:
private:
T *pFirst,*pLast,*pEnd;
c++
private
access-specifier
Rei demônio
fonte
fonte
const&
getter público ou por valor para cada um? Então eles são apenas 'write-private', & pois os valores desperdiçam recursos e falham para membros não copiáveis.) Estou perplexo com o sucesso de uma pergunta tão vazia, perguntando sobre a construção de cópias, ignorando totalmente o que significa, e nenhuma resposta usa lógica básica para desmascará-la. Eles explicam detalhes técnicos áridos, mas há uma resposta muito mais simples para uma pergunta tão cerradaRespostas:
IMHO, as respostas existentes explicam mal o "Porquê" disso - concentrando-se demais em reiterar qual comportamento é válido. "modificadores de acesso funcionam no nível da classe, e não no nível do objeto." - sim mas por quê?
O conceito abrangente aqui é que são os programadores que projetam, escrevem e mantêm uma classe de quem se espera que entendam o encapsulamento OO desejado e tenham o poder de coordenar sua implementação. Então, se você está escrevendo
class X
, você está codificando não apenas como umX x
objeto individual pode ser usado pelo código com acesso a ele, mas também como:X
objetos distintos cooperam para fornecer os comportamentos pretendidos, ao mesmo tempo que respeitam as pós-condições e invariantes de seu projeto.Não é apenas o construtor de cópia - muitas operações podem envolver duas ou mais instâncias de sua classe: se você está comparando, adicionando / multiplicando / dividindo, construindo cópias, clonando, atribuindo etc., então é comum que você ou simplesmente deve ter acesso a dados privados e / ou protegidos no outro objeto, ou deseja permitir uma implementação de função mais simples, rápida ou geralmente melhor.
Especificamente, essas operações podem querer tirar proveito do acesso privilegiado para fazer coisas como:
shared_ptr
s para referenciar dados etc.auto_ptr<>
"move" a propriedade para o objeto em construçãounordered_map
membro, mas publicamente apenas exporbegin()
eend()
iteradores - com acesso direto asize()
você, pode terreserve
capacidade para uma cópia mais rápida; pior ainda se eles apenas expõemat()
einsert()
e de outra formathrow
....fonte
this == other
cada vez que você acessa, oother.x
que seria necessário, os modificadores de acesso funcionariam no nível do objeto.this == other
cada vez que você acessaother.x
" - erra o ponto - seother.x
só fosse aceito em tempo de execução quando equivalente athis.x
, não haveria muito ponteiro escritoother.x
em primeiro lugar; o compilador também pode forçá-lo a escreverif (this == other) ...this.x...
o que quer que você vá fazer. Sua concepção de "conveniência (ainda mais se as variáveis privadas fossem públicas)" também perde o ponto - a forma como o Padrão é definido é restritiva o suficiente para permitir o encapsulamento adequado , mas não desnecessariamente inconveniente.Os modificadores de acesso funcionam no nível da classe , e não no nível do objeto .
Ou seja, dois objetos da mesma classe podem acessar os dados privados um do outro.
Por quê:
Principalmente devido à eficiência. Seria uma sobrecarga de tempo de execução não desprezível verificar se
this == other
cada vezother.x
que você acessasse, seria necessário se os modificadores de acesso funcionassem no nível do objeto.Também é semanticamente lógico se você pensar nisso em termos de escopo: "Qual grande parte do código eu preciso ter em mente ao modificar uma variável privada?" - Você precisa manter o código de toda a classe em mente, e isso é ortogonal aos objetos existentes em tempo de execução.
E é extremamente conveniente ao escrever construtores de cópia e operadores de atribuição.
fonte
Você pode acessar membros privados de uma classe de dentro da classe, mesmo aqueles de outra instância.
fonte
Para entender a resposta, gostaria de lembrar alguns conceitos.
this
o ponteiro é passado para todas as funções quando chamado.Agora, por causa do
this
ponteiro, a função é capaz de localizar variáveis daquela instância particular. não importa se é privado ou público. ele pode ser acessado dentro dessa função. Agora, se passarmos um ponteiro para outro objeto da mesma classe. usando este segundo ponteiro, poderemos acessar membros privados.espero que isso responda sua pergunta.
fonte
O construtor de cópia é a função de membro da classe e, como tal, tem acesso aos membros de dados da classe, mesmo aqueles declarados como 'privados'.
fonte