Sind Konstrukteure zum Kopieren und Verschieben automatische Freunde?

14

Wir können auf private Variablen einer anderen Klasse zugreifen, wenn wir Kopier- oder Verschiebungskonstruktoren definieren. Schafft C ++ sie friendautomatisch miteinander?

Zum Beispiel:

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
quelle
7
Dies ist die gleiche Klasse. Also wird ne Freund gebraucht.
M. Spiller
1
Siehe stackoverflow.com/questions/6921185/... - kurz gesagt, Zutrittskontrolle in C ++ nicht discern zwischen Objektinstanzen , nur zwischen verschiedenen Arten.
Osuka_
Wenn Sie "eine andere my_str-Klasse" schreiben, ist dies ein direkter Fehler. Es ist eine weitere my_str- Instanz , und andere Kommentare und Antworten erklären, was dies bedeutet
JonathanZ unterstützt MonicaC

Antworten:

21

Es wird nicht als Freund betrachtet, aber ja, jede Mitgliedsfunktion der Klasse my_strkann auf private Mitglieder aller Instanzen des Typs zugreifen my_str, nicht nur auf die thisInstanz:

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

Die allgemeine Idee dahinter ist, zwei oder mehr Objekten des gleichen Typs die Interaktion zu ermöglichen, ohne ihre privaten Mitglieder aussetzen zu müssen.

Shloim
quelle
10

Elementfunktionen der Klasse selbst haben immer Zugriff auf die privateElemente, unabhängig davon, ob die Elementfunktion in der Klasse oder außerhalb der Klasse definiert ist und ob es sich um eine spezielle Elementfunktion wie einen Kopier- / Verschiebungskonstruktor handelt.

Deshalb gehören sie nicht friendzur Klasse, denn das macht keinen Sinn. Sie sind bereits Teil der Klasse. Trotzdem haben sie Zugriff auf alle privateMitglieder, nicht weil sie friends sind, sondern weil sie Teil der Klasse sind.

Wenn es nicht möglich wäre, Mitglieder in einem Konstruktor zu initialisieren (weil auf sie nicht zugegriffen werden kann), wäre das gesamte Konzept der Zugänglichkeit von Mitgliedern sinnlos. (Wie würden Sie das Mitglied initialisieren?)


Die Zugänglichkeit hängt auch in keiner Weise von dem Objekt ab, auf das auf ein Mitglied zugegriffen wird. Die Barrierefreiheit hängt nur davon ab, wo im Code ein Name (der Name des Mitglieds) verwendet wird. Wenn eine Funktion auf das Mitglied einer Instanz einer Klasse zugreifen kann, kann sie auch auf das Mitglied einer anderen Instanz derselben Klasse zugreifen.

Nussbaum
quelle