copiar e mover construtores são amigos automáticos?

14

Podemos acessar variáveis ​​privadas de outra classe quando definimos copiar ou mover construtores. O C ++ os friendcria automaticamente automaticamente?

Por exemplo:

my_str::my_str(my_str&& m) 
{
    size_ = m.size_; //accessing private variable another my_str class
    buff_ = m.buff_; //accessing private variable another my_str class
    m.buff_ = nullptr;
    m.size_ = 0;
}
redkont
fonte
7
Esta é a mesma classe. Então, ne amigo é necessário.
M. Spiller
11
Consulte stackoverflow.com/questions/6921185/… - em resumo, o controle de acesso em C ++ não discerne entre instâncias de objeto , apenas entre tipos diferentes.
osuka_ 25/11/19
Quando você escreve "outra classe my_str", é um erro direto. É outra instância my_str , e outros comentários e respostas explicam o que isso implica
JonathanZ suporta MonicaC 25/11/19

Respostas:

21

Não é considerado amigo, mas sim, qualquer função membro da classe my_strpode acessar membros privados de todas as instâncias do tipo my_str, não apenas a thisinstância:

class my_str {
    void foo(my_str& other) {
        // can access private members of both this-> and other.
    }

    static void bar(my_str& other) {
        // can access private members of other.
    }
};

A idéia geral por trás disso é permitir que dois ou mais objetos do mesmo tipo interajam sem precisar expor seus membros privados.

Shloim
fonte
10

As funções de membro da própria classe sempre têm acesso aos privatemembros, independentemente de a função de membro ser definida dentro ou fora da classe e não importa se é uma função de membro especial, como um construtor de copiar / mover.

Portanto, eles não são friendda classe, porque isso não faz nenhum sentido. Eles já fazem parte da turma. Ainda assim, eles têm acesso a todos os privatemembros, não porque sejamfriend s, mas porque fazem parte da classe.

Se não fosse possível inicializar membros em um construtor (porque eles são inacessíveis), todo o conceito de acessibilidade de membros seria inútil. (Como você inicializaria o membro?)


Além disso, a acessibilidade não é de forma alguma uma questão do objeto no qual um membro é acessado. A acessibilidade é uma questão apenas de onde no código um nome (o nome do membro) é usado. Se uma função puder acessar o membro de uma instância de uma classe, também poderá acessar o membro de outra instância da mesma classe.

noz
fonte