क्या कॉपी और मूवर्स कंस्ट्रक्टर्स ऑटोमैटिक फ्रेंड्स हैं?


14

जब हम कॉपी को परिभाषित करते हैं या निर्माणकर्ताओं को स्थानांतरित करते हैं, तो हम दूसरे वर्ग के निजी चर का उपयोग कर सकते हैं। क्या सी ++ उन्हें friendस्वचालित रूप से एक दूसरे के लिए बनाता है ?

उदाहरण के लिए:

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
यह वही वर्ग है। तो दोस्त की जरूरत है।
एम। स्पिलर

1
देखें stackoverflow.com/questions/6921185/… - संक्षेप में, C ++ में अभिगम नियंत्रण वस्तु उदाहरणों के बीच, केवल विभिन्न प्रकारों के बीच नहीं होता है।
ओसुका_

जब आप "एक और my_str वर्ग" लिखते हैं तो यह एक सीधी-सी गलती है। यह एक और my_str उदाहरण है , और अन्य टिप्पणियाँ और उत्तर बताते हैं कि जो बात बताती है
जोनाथनज़

जवाबों:


21

यह मित्र नहीं माना जाता है, लेकिन हाँ, वर्ग का कोई भी सदस्य कार्य केवल उदाहरण के लिए नहीं, बल्कि my_strसभी प्रकार के निजी सदस्यों तक पहुँच सकता है :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.
    }
};

इसके पीछे सामान्य विचार यह है कि एक ही प्रकार की 2 या अधिक वस्तुओं को अपने निजी सदस्यों को उजागर किए बिना बातचीत करने की अनुमति दी जाए।


10

वर्ग के सदस्य कार्यों में सदैव privateसदस्यों की पहुँच होती है , चाहे वह सदस्य फ़ंक्शन वर्ग या आउट-ऑफ-क्लास के रूप में परिभाषित किया गया हो या नहीं और कोई विशेष सदस्य फ़ंक्शन जैसे कॉपी / मूव कंस्ट्रक्टर हो।

इसलिए वे friendवर्ग के नहीं हैं , क्योंकि इससे कोई मतलब नहीं है। वे पहले से ही कक्षा का हिस्सा हैं। फिर भी, उनके पास सभी privateसदस्यों तक पहुंच है , इसलिए नहीं कि वे friendएस हैं, बल्कि इसलिए कि वे वर्ग का हिस्सा हैं।

यदि किसी कंस्ट्रक्टर में प्रारंभिक सदस्यों को रखना संभव नहीं था (क्योंकि वे अप्राप्य हैं), तो सदस्य अभिगम्यता की पूरी अवधारणा निरर्थक होगी। (आप सदस्य को कैसे आरंभ करेंगे?)


इसके अलावा, पहुंच किसी भी तरह से उस वस्तु का मामला नहीं है जिस पर कोई सदस्य पहुंचता है। एक्सेसिबिलिटी केवल एक मामला है जहां कोड में एक नाम (सदस्य का नाम) का उपयोग किया जाता है। यदि कोई फ़ंक्शन किसी वर्ग के एक उदाहरण के सदस्य तक पहुँच सकता है, तो वह उसी वर्ग के किसी अन्य उदाहरण के सदस्य तक भी पहुँच सकता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.