les constructeurs de copier-déplacer sont-ils des amis automatiques?

14

Nous pouvons accéder aux variables privées d'une autre classe lorsque nous définissons des constructeurs de copie ou de déplacement. Est-ce que C ++ se fait friendautomatiquement?

Par exemple:

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
la source
7
C'est la même classe. Donc, aucun ami n'est nécessaire.
M. Spiller
1
Voir stackoverflow.com/questions/6921185/… - en bref, le contrôle d'accès en C ++ ne discerne pas entre les instances d' objet , seulement entre différents types.
osuka_
Lorsque vous écrivez "une autre classe my_str", c'est une erreur directe. C'est une autre instance de my_str , et d'autres commentaires et réponses expliquent ce que cela implique
JonathanZ prend en charge MonicaC

Réponses:

21

Il n'est pas considéré comme un ami, mais oui, toute fonction membre de la classe my_strpeut accéder aux membres privés de toutes les instances de type my_str, pas seulement l' thisinstance:

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.
    }
};

L'idée générale derrière cela est de permettre à 2 ou plusieurs objets du même type d'interagir sans avoir à exposer leurs membres privés.

Shloim
la source
10

Les fonctions membres de la classe elle-même ont toujours accès aux privatemembres, que la fonction membre soit définie en classe ou hors classe et qu'il s'agisse d'une fonction membre spéciale telle qu'un constructeur de copie / déplacement.

Par conséquent, ils ne sont pas friendde la classe, car cela n'a aucun sens. Ils font déjà partie de la classe. Pourtant, ils ont accès à tous les privatemembres, non pas parce qu'ils sont friends, mais parce qu'ils font partie de la classe.

S'il n'était pas possible d'initialiser des membres dans un constructeur (car ils sont inaccessibles), alors le concept entier d'accessibilité aux membres serait inutile. (Comment initialiseriez-vous le membre?)


De plus, l'accessibilité n'est en aucune façon une question de l'objet sur lequel un membre est accédé. L'accessibilité ne dépend que de l'endroit où dans le code un nom (le nom du membre) est utilisé. Si une fonction peut accéder au membre d'une instance d'une classe, elle peut également accéder au membre d'une autre instance de la même classe.

noyer
la source