czy konstruktorzy kopiują i przenoszą się automatycznie?

14

Możemy uzyskać dostęp do zmiennych prywatnych innej klasy, gdy definiujemy konstruktory kopiujące lub przenoszące. Czy C ++ tworzy je friendautomatycznie?

Na przykład:

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
źródło
7
To jest ta sama klasa. Potrzebny jest więc nowy przyjaciel.
M. Spiller,
1
Zobacz stackoverflow.com/questions/6921185/... - krótko mówiąc, kontrola dostępu w C ++ nie rozróżnia instancji obiektów , a tylko różne typy.
osuka_
Kiedy piszesz „inną klasę my_str”, jest to zwykły błąd. To kolejna instancja my_str , a inne komentarze i odpowiedzi wyjaśniają, co się z tym wiąże
JonathanZ wspiera MonicaC

Odpowiedzi:

21

Nie jest uważane za przyjaciela, ale tak, każda funkcja klasy my_strmoże uzyskać dostęp do prywatnych członków wszystkich instancji typu my_str, nie tylko thisinstancji:

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

Ogólna idea polega na umożliwieniu interakcji co najmniej 2 obiektom tego samego typu bez konieczności ujawniania ich prywatnych członków.

Shloim
źródło
10

Funkcje składowe samej klasy zawsze mają dostęp do elementów privateskładowych, bez względu na to, czy funkcja składowa jest zdefiniowana w klasie, czy poza klasą i bez względu na to, czy jest to specjalna funkcja składowa, taka jak konstruktor kopiuj / przenieś.

Dlatego nie należą frienddo klasy, ponieważ nie ma to żadnego sensu. Są już częścią klasy. Mimo to mają dostęp do wszystkich privateczłonków, nie dlatego, że są friend, ale dlatego, że należą do klasy.

Gdyby nie było możliwe zainicjowanie elementów w konstruktorze (ponieważ są one niedostępne), wówczas cała koncepcja dostępności elementów byłaby bezcelowa. (Jak zainicjowałbyś członka?)


Ponadto dostępność nie jest w żaden sposób kwestią obiektu, do którego uzyskuje się dostęp do członka. Dostępność zależy tylko od tego, gdzie w kodzie użyta jest nazwa (nazwa członka). Jeśli funkcja może uzyskać dostęp do członka jednej instancji klasy, może również uzyskać dostęp do członka innej instancji tej samej klasy.

orzech włoski
źródło