web-dev-qa-db-fra.com

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

Nous pouvons accéder aux variables privées d'une autre classe lorsque nous définissons des constructeurs de copie ou de déplacement. C++ les fait-il friend automatiquement les uns aux autres?

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;
}
14
redkont

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

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.

21
Shloim

Les fonctions membres de la classe elle-même ont toujours accès aux membres private, 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'une copie/déplacer le constructeur.

Ils ne sont donc pas friend de la classe, car cela n'a aucun sens. Ils font déjà partie de la classe. Pourtant, ils ont accès à tous les membres private, 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?)


En outre, 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.

10
walnut