Możemy uzyskać dostęp do zmiennych prywatnych innej klasy, gdy definiujemy konstruktory kopiujące lub przenoszące. Czy C ++ tworzy je friend
automatycznie?
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;
}
c++
friend-class
Redkont
źródło
źródło
Odpowiedzi:
Nie jest uważane za przyjaciela, ale tak, każda funkcja klasy
my_str
może uzyskać dostęp do prywatnych członków wszystkich instancji typumy_str
, nie tylkothis
instancji:Ogólna idea polega na umożliwieniu interakcji co najmniej 2 obiektom tego samego typu bez konieczności ujawniania ich prywatnych członków.
źródło
Funkcje składowe samej klasy zawsze mają dostęp do elementów
private
skł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żą
friend
do klasy, ponieważ nie ma to żadnego sensu. Są już częścią klasy. Mimo to mają dostęp do wszystkichprivate
czł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.
źródło