ve hareket yapıcılar otomatik arkadaşlar nelerdir?


14

Kopyalama veya taşıma yapıcılarını tanımlarken başka bir sınıfın özel değişkenlerine erişebiliriz. C ++ onları friendotomatik olarak birbirlerine yapar mı ?

Örneğin:

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

7
Bu aynı sınıf. Yani ne arkadaşa ihtiyaç var.
M. Spiller

1
Bkz. Stackoverflow.com/questions/6921185/… - kısacası, C ++ 'da erişim denetimi nesne örnekleri arasında değil , yalnızca farklı türler arasında fark etmez .
osuka_

"Başka bir my_str sınıfı" yazdığınızda, bu düz bir hatadır. Bu başka bir my_str örneği ve diğer yorumlar ve cevaplar bunun ne anlama geldiğini açıklıyor
JonathanZ MonicaC'yi destekliyor

Yanıtlar:


21

Arkadaş olarak kabul edilmez, ancak evet, sınıfın herhangi bir üye işlevi, yalnızca örnek değil my_str, türün tüm örneklerinin özel üyelerine erişebilir :my_strthis

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

Bunun arkasındaki genel fikir, aynı türde 2 veya daha fazla nesnenin özel üyelerini açığa vurmadan etkileşime girmesine izin vermektir.


10

Sınıf işlevinin sınıf privateişlevleri veya sınıf dışı tanımlanmış olsun ya da bir kopyala / taşı kurucu gibi özel bir üye işlevi olsun , sınıfın kendisinin üye işlevleri her zaman üyelere erişebilir .

Dolayısıyla friendsınıfta değillerdir , çünkü bu bir anlam ifade etmez. Zaten sınıfın bir parçasılar. Yine de tüm privateüyelere erişimleri vardır , çünkü onlar friends değil, sınıfın bir parçası oldukları için.

Üyeleri bir kurucuda başlatmak mümkün değilse (erişilemez oldukları için), üye erişilebilirliği kavramının tamamı anlamsız olacaktır. (Üyeyi nasıl başlatırsınız?)


Ayrıca, erişilebilirlik hiçbir şekilde bir üyenin erişildiği nesne ile ilgili değildir. Erişilebilirlik yalnızca kodda bir adın (üyenin adı) kullanıldığı konudur. Bir işlev bir sınıfın bir örneğinin üyesine erişebiliyorsa, aynı sınıfın başka bir örneğinin üyesine de erişebilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.