फ्रेंड(friend) फंकशन(function) और फ्रेंड क्लास(friend Class) वेलकम टू मॉड्यूल(module) 17 ऑफ प्रोग्रामिंग सी ++ में । इस मॉड्यूल(module) में, हम फ्रेंड(friend) फंकशन(function) और फ्रेंड क्लास(friend Class) के बारे में बात करेंगे, जो यह समझने की कोशिश कर रहे हैं कि उनका क्या मतलब है और वे C ++ डिज़ाइन प्रक्रिया में क्यों उपयोगी हैं। ये मॉड्यूल(module) की रूपरेखा होगी हम मैट्रिक्स(matrix) वेक्टर(vector) गुणा (Matrix Vector Multiplication) और लिंक की गई सूची के उदाहरण लेंगे, और अंत में कुछ नोटों के साथ समाप्त हो जाएंगे। जैसा कि आप जानते हैं कि आम तौर पर आपकी स्लाइड के बाईं ओर रूपरेखा उपलब्ध होगी। तो, चलिए पहले फ्रेंड फंक्शन(friend function) की मूल धारणा का परिचय देते हैं। बाईं ओर आपको साधारण फ़ंक्शन(function) का दृश्य दिखाई देता है। तो स्थिति कुछ इस प्रकार है, कि मेरे पास एक क्लास(class) मैक्लास(myclass) है जो कुछ निजी डेटा(data) के रूप में है, इसमें एक निर्माता है, और यह है; मुझे खेद है अगर सिर्फ इस लाइन को नजरअंदाज किया जाए। मेरे पास यह फ़ंक्शन(function) इस क्लास(class) के बाहर लिखा गया है जो क्लास(class) के साथ कुछ करने की कोशिश कर रहा है। यह क्या कर रहा हैं? यह संदर्भ द्वारा कॉल पैरामीटर(parameter) को संदर्भ पैरामीटर(parameter) कॉल द्वारा लेता है, और फिर यह उस उद्देश्य के डेटा(data) तत्व घटक को प्रिंट(print) करने का प्रयास करता है। अब, हम क्या जानते हैं, यह निजी है, इसलिए, अगर मेरे पास कोई फ़ंक्शन(function) है, तो मुझे इस ऑब्जेक्ट(object) तक पहुंचने का अधिकार नहीं है। तो, विचार करें कि यह नहीं है। यह एक त्रुटि को जन्म देगा और आपको इस तरह की त्रुटि मिलेगी कि मैक्लास(myclass) में घोषित निजी सदस्य तक नहीं पहुंच सकता है, क्योंकि अब तक आप जिस कारण को अच्छी तरह से जानते हैं वह यह एक वैश्विक कार्य है और यह एक निजी डेटा(data) है, जिससे आप सीधे डेटा(data) को एक्सेस(access) नहीं कर सकते यह। अब, हम दाहिने हाथ की ओर देखते हैं। दाहिने हाथ की ओर में, हमारे पास बिल्कुल समान कोड है, सिवाय इसके कि हमने इसे क्लास(class) में पेश किया है, वैसे ही हम सदस्य फ़ंक्शन(function) को परिभाषित करते हैं, लेकिन इस अंतर के साथ कि यह समावेश एक कीवर्ड(keyword) फ्रेंड(friend) द्वारा उपसर्ग है। अब यह डिस्प्ले(display) को क्लास का सदस्य फ़ंक्शन(function) नहीं बनाता है, डिस्प्ले क्लास का सदस्य फ़ंक्शन(function) नहीं है, यह एक वैश्विक फ़ंक्शन(function) है। एक विशेष प्रकार का एक ग्लोबल फंक्शन जो मायक्लास का दोस्त है, लेकिन इसके साथ ही जब मैं कहता हूं कि यह ग्लोबल फंक्शन डिसप्ले जो रेफरेंस द्वारा मायक्लास(myclass) की एक वस्तु लेता है और शून्य हो जाता है, जब मैं कहता हूं कि यह मायक्लास(myclass) का दोस्त है एक त्रुटि नहीं रहती है यह त्रुटि गायब हो जाती है, यह अब अनुमति है। तो अवधारणा इस तरह से है जैसे कि आप हमारे घर में भी जानते हैं अगर कोई हम में कदम रखेगा तो हम सामान्य रूप से उन्हें केवल ड्राइंग रूम में ले जा सकते हैं, जो कि सार्वजनिक स्थान की तरह है और हम उन्हें आंतरिक कमरों की अनुमति नहीं देंगे जो कि हमारा है निजी स्थान। लेकिन अगर मेरे पास कोई दोस्त है, तो मैं शायद उसे ड्राइंग रूम में इंतजार नहीं करवाऊंगा, बल्कि मैं उसे अपने कमरे में अपने बेड रूम या किचन वगैरह में ले जाऊंगा। तो यह एक समान अवधारणा की तरह है। तो यहाँ, उन्होंने कहा है कि यह फ़ंक्शन(function) myclass कह रहा है कि प्रदर्शन फ़ंक्शन(function) जो इस क्लास(class) के बाहर है जो सदस्य फ़ंक्शन(function) नहीं है, अभी भी एक फ्रेंड(friend) है और इसलिए, इस क्लास(class) का निजी डेटा(data) इस सदस्य के सामने आ जाएगा। यह एक फ्रेंड फंक्शन(friend function) का एक बेसिक आइडिया है और इसलिए यह इस तरह से जनरेट करेगा जैसे कंपटीशन(compilation) एरर(error) देगा लेकिन यह एक राइट होगा, आउटपुट(output) उत्पन्न होगा। इसके साथ ही हमें इस बात की एक औपचारिक परिभाषा देखने को मिलती है कि एक फ्रेंड फंकशन(friend function) क्या है, "क्लास(class) के एक फ्रेंड(friend) के कार्य की क्लास(class) के निजी और संरक्षित सदस्यों तक पहुँच होती है। " यह वह एनकैप्सुलेशन(encapsulation) तोड़ सकता है जो अभी भी चर्चा नहीं की है कि संरक्षित सदस्य क्या हैं लेकिन, कुछ समय के लिए पकड़ें जब हमने चर्चा की कि यह स्पष्ट हो जाएगा, लेकिन वे केवल उस निजी सदस्य की तरह बहुत अधिक हैं। तो इसमें क्लास(class) के दायरे में शामिल एक प्रोटोटाइप(prototype) होना चाहिए और दोस्त के साथ उपसर्ग होना चाहिए, हमारे पास प्रदर्शन फ़ंक्शन(function) के उदाहरण में ही है कि आप क्लास(class) के भीतर उस फ़ंक्शन(function) के हस्ताक्षर को फ्रेंड(friend) के साथ कैसे लिखते हैं यह कहना कि यह विशेष कार्य इस क्लास(class) का फ्रेंड(friend) है। अब यह फ़ंक्शन(function) क्लास से संबंधित नहीं है, यह सदस्य फ़ंक्शन(function) नहीं है इसलिए यह नाम क्लास के नाम से योग्य नहीं है क्योंकि हम सामान्य गैर फ्रेंड(friend) सदस्य कार्यों के लिए करते हैं। इसे किसी वस्तु का आह्वान करने के साथ नहीं बुलाया जाता है क्योंकि यह क्लास(class) का हिस्सा नहीं है। एक विशेष सदस्य फ़ंक्शन(function) या एक विशेष फ़ंक्शन(function) एक से अधिक क्लास(class) का दोस्त हो सकता है। अब, यदि आप देखते हैं कि सभी फ्रेंड फंक्शन(friend function) क्या हो सकते हैं; कोई भी वैश्विक फ़ंक्शन(function) किसी क्लास(class) का फ्रेंड(friend) हो सकता है, किसी भिन्न क्लास(class) का कोई भी सदस्य फ़ंक्शन(function) किसी क्लास(class) का फ्रेंड(friend) भी हो सकता है, या फ़ंक्शन(function) टेम्पलेट फ्रेंड(friend) फ़ंक्शन(function) हो सकता है। अब, फ़ंक्शन(function) टेम्प्लेट फिर से आपको नहीं पता है, लेकिन जब आप आते हैं तो आप समझेंगे कि यह कैसे काम करता है। इसके साथ ही, अब मुझे एक और ठोस समस्या से परिचित कराना है। यहाँ समस्या यह है कि मेरे पास दो कक्षाएं हैं, मेरे पास एक वेक्टर(vector) क्लास है जो एक आकार n के एक रैखिक वेक्टर(vector) को रखता है, और एक मैट्रिक्स(matrix) क्लास(class) होता है जो एक क्लास(class) मैट्रिक्स(matrix) रखता है, जरूरी नहीं कि क्लास(class) मैट्रिक्स(matrix) यह n by m आयाम का मैट्रिक्स(matrix) होगा। इसलिए, यह वेक्टर(vector) के लिए केवल चीजों को सरल रखने के लिए कंस्ट्रक्टर(constructor) है, ताकि मुझे वेक्टर(vector) के मूल्यों को दर्ज करने की आवश्यकता न हो, यहां मैंने सेट किया है जैसे कि कंस्ट्रक्टर(constructor) स्वयं कुछ मान सेट करता है। इसी तरह, मैट्रिक्स(matrix) के निर्माणकर्ता के लिए मानो जब वह मूल्यों का निर्माण करता है तो स्वचालित रूप से आरंभिक होता है। मेरा मतलब है कि उस मैट्रिक्स(matrix) या वेक्टर(vector) में क्या मूल्य मौजूद हैं जो हमारी रुचि के लिए नहीं है। हमारी रुचि क्या है? अब एक वेक्टर(vector) ऑब्जेक्ट(object) और एक मैट्रिक्स(matrix) ऑब्जेक्ट(object) दिया गया है, मैं एक फ़ंक्शन(function) को परिभाषित करना चाहता हूं जो कि उनके उत्पाद की गणना करने में सक्षम होगा। इसलिए मुझे इस तरह का फ़ंक्शन(function) चाहिए। एक फ़ंक्शन(function) ठेस जो यहां एक मैट्रिक्स(matrix) ऑब्जेक्ट(object) लेती है, मैंने इसे एक पॉइंटर(pointer) द्वारा लिया है एक वेक्टर(vector) ऑब्जेक्ट(object) लेता है, उन्हें निश्चित रूप से मैट्रिक्स(matrix) वेक्टर(vector) गुणा के नियमों का पालन करता है और मुझे वह परिणाम देता है जो इस मामले में निश्चित रूप से एक वेक्टर(vector) होगा। आप यहाँ क्या देख रहे हैं, यह विशेष रूप से कार्य करता है और यह कार्यान्वयन है मैं कार्यान्वयन के माध्यम से नहीं जा रहा हूं आप इसे बाद के समय में देख सकते हैं यह एक विशिष्ट मैट्रिक्स(matrix) वेक्टर(vector) गुणन कोड है। हाइलाइट करने के लिए मुझे क्या दिलचस्पी है, एक तथ्य यह है कि यह समारोह यहां मैंने इसे एक वैश्विक फ़ंक्शन(function) के रूप में लिखा है। इस फ़ंक्शन(function) को वेक्टर(vector) के आंतरिक तक पहुंचने की आवश्यकता है यह निश्चित रूप से इस सरणी और आयाम तक पहुंचने की आवश्यकता होगी। इसी तरह, इसके लिए मैट्रिक्स(matrix) और उसके आयामों तक पहुंचने की भी आवश्यकता होगी ताकि वे वास्तव में अपने उत्पाद की गणना कर सकें। अब, फ्रॉड(prod) इन वर्गों में से किसी का सदस्य नहीं है। वास्तव में, इसे सदस्य बनाने से समस्या का समाधान नहीं होता है, क्योंकि अगर मैं उत्पादों को वेक्टर(vector) का सदस्य बनाता हूं तो यह इन तक आसानी से पहुंच सकता है, लेकिन यह अभी भी इन तक नहीं पहुंच सकता है। अगर मैं ठेस को मैट्रिक्स(matrix) का सदस्य बनाता हूं तो मैं इन तक पहुंच बना सकता हूं लेकिन मैं इस तक नहीं पहुंच सकता। इसलिए यहां मैं एक समाधान प्रदान कर रहा हूं कि मैं इसे एक वैश्विक समारोह बनाऊंगा, जो इन वर्गों में से प्रत्येक के बाहर है, लेकिन मैं क्या करूं कि मैं इन दोनों वर्गों में एक फ्रेंड(friend) कार्य करता हूं। अगर मैंने एक प्रोडक्ट को क्लास वेक्टर(vector) का दोस्त बनाया है, तो इसका मतलब जरूरी है कि प्रोडक्ट इन निजी डेटा सदस्यों तक पहुंच बना सकेगा क्योंकि यह एक वेक्टर(vector) का दोस्त है। इसी तरह, मुझे मैट्रिक्स(matrix) क्लास के निजी सदस्यों तक पहुंचने की आवश्यकता है, इसलिए मैं मैट्रिक्स(matrix) क्लास में भी एक दोस्त को प्रोडक्ट बनाता हूं। एक बार जब मैंने ऐसा कर लिया तो यह कोड संकलित हो जाएगा क्योंकि जब भी मैं वेक्टर(vector) के निजी डेटा सदस्यों या मैट्रिक्स(matrix) के निजी डेटा सदस्यों के लिए संदर्भ बना रहा हूं, दोनों सुलभ हैं क्योंकि ठेस इन दोनों वर्गों का फ्रेंड(friend) है और यह कोड संकलित करेगा और अगर मैं लिखूं उस के साथ एक मुख्य अनुप्रयोग। मैंने आयाम के कुछ मैट्रिक्स(matrix) का निर्माण कहां किया है आयाम तीन के तीन तीन वेक्टर(vector) के रूप में मैंने पहले ही उल्लेख किया है कि उनके मूल्यों को डिफ़ॉल्ट रूप से भरा जा रहा है और यही मैट्रिक्स(matrix) से भरा हुआ है, इसलिए फ़ंक्शन(function) दिखाता है कि यह एक वेक्टर(vector) है और इसके बाद यदि मैं गुणा करता हूं तो पीवी मैट्रिक्स(matrix) का गुणन है और वेक्टर(vector) और पीवी इस आउटपुट(output) के रूप में बदल जाएंगे। यहाँ मैं इस फ़ंक्शन(function) को लिख सकता था, मैं इस फ़ंक्शन(function) को तब तक नहीं लिख सकता था जब तक कि मेरे पास फ्रेंड(friend) फ़ंक्शन(function) सुविधा नहीं थी। क्योंकि मैं उत्पादों को वेक्टर(vector) का सदस्य बना सकता हूं या मैं इसे मैट्रिक्स(matrix) का सदस्य बना सकता हूं, लेकिन मैं निश्चित रूप से इसे दोनों का सदस्य नहीं बना सकता, लेकिन इन दोनों वर्गों के सदस्यों तक पहुंचने के लिए गुणा की गणना करने में सक्षम होना चाहिए। इसलिए, जब भी हम ऐसी स्थिति में आते हैं, जहां कार्यक्षमता को पूरा करने के लिए मुझे आंतरिक या निजी डेटा(data) सदस्यों और दो या अधिक स्वतंत्र वर्गों के तरीकों की आवश्यकता होती है, तो मुझे जगह में आने के लिए फ्रेंड(friend) फ़ंक्शन(function) सुविधा की आवश्यकता होती है। यह यहाँ एक और उदाहरण है; उदाहरण मैं एक सूची बनाने की कोशिश कर रहा हूं। तो मैं एक सूची कैसे बनाऊं? मेरे पास एक नोड(node) क्लास है। एक नोड(node) क्लास(class) मूल नोड(node) जानकारी को परिभाषित करता है जिसमें डेटा(data) हिस्सा होता है और सूची में अगले नोड(node) से लिंक करने के लिए एक लिंक हिस्सा होता है। और मेरे पास एक सूची क्लास(class) है, जो वास्तव में इस पूरी सूची को रखता है इसलिए यह ऐसा है। सूची क्लास(class) में दो बिंदुओं, हेडर पॉइंटर(pointer) और टेल पॉइंटर(pointer) को सामान्य रूप से देखा जा सकता है, इसलिए यह कुछ इस तरह दिखाई देगा, मेरे पास इस तरह की एक सूची होगी, यह कहें कि यह 2 है यह 3 है और बता दें कि सूची समाप्त हो गई है यहाँ। तो, मेरा सिर सूची की शुरुआत को इंगित करेगा और पूंछ सूची के अंत में इंगित करेगा। इसलिए मैं वास्तव में ऐसी संरचना बनाना चाहता हूं और फिर मैं सूची का उपयोग करना चाहूंगा। मान लीजिए, यदि मैं प्रदर्शित होने वाली सूची में इस प्रकार की कार्यक्षमता को लागू करना चाहता हूं, तो यह सूची पर जाता है और आपके पास या आपके द्वारा सूची में संलग्न सभी तत्वों को आउटपुट(output) करता है। अगर मैं कहना चाहता हूं कि सूची:: प्रदर्शन, यह सूची का एक सदस्य कार्य है। इसलिए अगर मैं इसे लागू करना चाहता हूं तो मुझे नोड(node) की आंतरिक जानकारी की आवश्यकता है, क्योंकि जब तक मैं नोड(node) की जानकारी तक नहीं पहुंच सकता हूं मैं उस मूल्य को प्रिंट(print) नहीं कर सकता। जब तक मैं नोड(node) के अगले क्षेत्र का उपयोग नहीं कर सकता, मैं सूची पर अगले नोड(node) तक नहीं जा सकता, इसलिए मुझे उन्हें एक्सेस(access) करने की आवश्यकता है। लेकिन मूल रूप से प्रदर्शन क्लास(class) सूची का एक सदस्य कार्य है, इसलिए यह मुझे नोड(node) क्लास(class) के निजी सदस्यों तक पहुंचने की अनुमति नहीं देता है और जहां मैं फ्रेंड(friend) का उपयोग करता हूं। मैं क्या करूं? नोड(node) मेंवर्ग I प्रदर्शन समारोह के हस्ताक्षर लिखता है। ध्यान दें प्रदर्शन एक सदस्य फ़ंक्शन(function) है इसलिए प्रदर्शन फ़ंक्शन(function) का नाम वास्तव में सूची है:: नोड(node), इसलिए मैं यहां लिख रहा हूं क्योंकि मुझे खेद है, सदस्य फ़ंक्शन(function) का नाम डिस्प्ले है और पूरा नाम सूची है: प्रदर्शन। इसलिए, मैं यहां संपूर्ण हस्ताक्षर लिख रहा हूं और मैं कीवर्ड फ्रेंड(friend) के साथ उपसर्ग कर रहा हूं। प्रदर्शन और परिशिष्ट दोनों, जो सूची के सदस्य कार्य हैं, को नोड(node) क्लास(class) के फ्रेंड(friend) के रूप में बनाया गया है, इसका मतलब है कि जब मैं प्रदर्शन को लागू करने का प्रयास करता हूं या मैं एपेंड को लागू करने का प्रयास करता हूं तो वे नोड(node) क्लास(class) के निजी डेटा(data) सदस्यों तक पहुंचने में सक्षम होंगे और मैं जगह में एक बहुत अच्छी सूची कार्यान्वयन प्राप्त करने में सक्षम हो जाएगा, और अगर वहाँ एक आवेदन बस जो एक अशक्त सूची बनाता है कुछ नोड(node) ऑब्जेक्ट(object) बनाता है और फिर यह नोड(node) ऑब्जेक्ट(object) को एक के बाद एक जोड़ देता है और यह अंततः सूची को प्रिंट(print) करेगा। यदि आप इसे करते हैं तो आपको 1 2 3 की छपाई मिलेगी क्योंकि हमने 3 मोड बनाए हैं, जिनका मूल्य 1 2 और 3 है, जो बहुत महत्वपूर्ण नहीं है। मैं यह बताना चाहता था कि फ्रेंड(friend) फ़ंक्शन(function) का उपयोग करके आप वास्तव में बहुत अच्छी तरह से ऐसी कक्षाओं से लिंक कर सकते हैं जो कुछ हद तक संबंधित हैं, लेकिन पूरी तरह से स्वतंत्र हैं जो कि आदिम नोड(node) देता है जिसे आप मूल्य रखना चाहते हैं और दूसरा जो वास्तव में सूची का प्रबंधन करता है संरचना, प्रबंधन और हटाने, उनमें कार्यक्षमता की तरह प्रदर्शित करती है। और हम उनकी एनकैप्सुलेशन(encapsulation) सीमा में कटौती कर रहे हैं हम नोड(node) क्लास के दोस्त के रूप में सूची क्लास(class) के कुछ सदस्य कार्यों को बनाकर नोड(node) के एनकैप्सुलेशन(encapsulation) में एक संपूर्ण कार्य कर रहे हैं। मैट्रिक्स(matrix) वेक्टर(vector) गुणन के पहले उदाहरण की तुलना में जिसने दिखाया कि कैसे एक वैश्विक फ़ंक्शन(function) को दो वर्गों का दोस्त बनाया जा सकता है, यहां मुझे आवश्यक रूप से दिखाया गया है कि एक सदस्य फ़ंक्शन(function), वास्तव में एक क्लास(class) के दो सदस्य कार्यों को दूसरे क्लास(class) का दोस्त बनाया गया है। मैट्रिक्स(matrix) वेक्टर(vector) गुणन को इस शैली में भी हल किया जा सकता है कि मैं उत्पादों को वेक्टर(vector) का सदस्य कार्य बना सकता हूं और उस वेक्टर(vector) को बना सकता हूं:: मैट्रिक्स(matrix) का एक दोस्त या इसके विपरीत, जो उत्पादों को मैट्रिक्स(matrix) के सदस्य फ़ंक्शन(function) का निर्माण करता है और फिर मैट्रिक्स(matrix) बनाता है: : वेक्टर(vector) के एक दोस्त ठेस। यह आमतौर पर है कि कैसे बेहतर लाभ के लिए फ्रेंड(friend) फ़ंक्शन(function) सुविधा का उपयोग किया जा सकता है। इसमें विस्तार का कुछ अंश है, यह विस्तार इस तथ्य से प्रेरित है कि यदि आप सूची और नोड(node) उदाहरण के बारे में सोचते हैं, तो हमें सूची के दोनों सदस्य कार्यों के साथ-साथ और नोड(node) के दोस्त होने का प्रदर्शन परिशिष्ट की भी आवश्यकता है। अब, यदि सूची कक्षाएं हटा दी जाती हैं, तो उसे नोड(node) और इतने पर फ्रेंड(friend) होने की भी आवश्यकता होगी। एक शॉर्टकट है जो आप कर सकते हैं और वह एक फ्रेंड क्लास(friend Class) के संदर्भ में है। इसलिए यदि मेरे पास दो कक्षाएं हैं तो हम एक क्लास(class) को दूसरे के दोस्त के रूप में बना सकते हैं, बस उस क्लास(class) का नाम और दोस्त के साथ उपसर्ग कर सकते हैं। यदि एक क्लास(class) दूसरे का फ्रेंड(friend) है, तो उसकी क्लास(class) के निजी और संरक्षित सदस्यों तक पहुंच है। किसी फ्रेंड(friend) फ़ंक्शन(function) के लिए, जो विशेष फ़ंक्शन(function) का उपयोग करता है, एक फ्रेंड क्लास(friend Class) के लिए उस क्लास(class) के सभी तरीकों की पहुंच निजी डेटा(data) सदस्यों और फ्रेंड क्लास(friend Class) के सदस्य कार्यों से होती है, इसके बावजूद कि मैं किस फ़ंक्शन(function) के सदस्य की बात कर रहा हूं। स्वाभाविक रूप से, चूंकि यह एक क्लास(class) है, क्योंकि यह पूरी तरह से इस क्लास(class) का मतलब उस क्लास(class) के नाम से योग्य नहीं है, जिसके लिए यह दोस्त है, क्योंकि यह एक नेस्टेड क्लास(class) नहीं है, यह सिर्फ दो स्वतंत्र कक्षाएं हैं, मेरे पास यहां एक क्लास(class) है , मेरे यहाँ एक क्लास(class) है, मेरे पास यहाँ 1 है, मेरे पास यहाँ 2 है। मैं सिर्फ यह कह रहा हूं कि c 2 c 1 का फ्रेंड(friend) है, इसलिए उनका नाम उनका अलग-थलग नाम रहेगा और निश्चित रूप से एक क्लास(class) को एक से अधिक अन्य वर्गों में फ्रेंड(friend) घोषित किया जा सकता है। एक फ्रेंड क्लास(friend Class) क्या हो सकता है, एक क्लास(class) एक फ्रेंड क्लास(friend Class) हो सकता है और एक क्लास(class) एक फ्रेंड क्लास(friend Class) हो सकता है। क्लास टेम्प्लेट हमने अभी तक नहीं किया है जब हम टेंपलेट के बारे में पूरी बात करते हैं तो यह बात स्पष्ट हो जाएगी कि क्लास(class) टेम्प्लेट भी फ्रेंड क्लास(friend Class) कैसे बनते हैं। अब, फ्रेंड क्लास(friend Class) अवधारणा का उपयोग करके लिंक सूची उदाहरण को फिर से देखें। तो मैं पहले के उदाहरण में क्या कर रहा हूं, मैंने अभी दो पंक्तियों पर टिप्पणी की है, जिसे हम सदस्य फ़ंक्शन(function) प्रदर्शन और सदस्य क्लास(class) के नोड(node) क्लास के दोस्तों के रूप में सूची क्लास(class) के सदस्य के रूप में जोड़ रहे हैं, इसके बजाय मैंने पूरी सूची को क्लास(class) बना दिया है एक दोस्त के रूप में। यह इसे लिखने का तरीका है क्लास(class) और क्लास(class) का नाम आपके द्वारा संदर्भित तरीका है और फिर आपने एक फ्रेंड(friend) कीवर्ड को यह कहने के लिए सामने रखा कि यह नोड(node) क्लास(class) मानता है कि संपूर्ण सूची क्लास(class) यह फ्रेंड(friend) है। यह न केवल प्रदर्शन और अपेंड (संदर्भसमय: 19:14) जहां भी अन्य सदस्यों को हटाना पसंद है, जैसे खोज, जो भी सदस्य हम सूची क्लास(class) में जोड़ सकते हैं, उन सभी को नोड(node) क्लास के एक फ्रेंड(friend) के रूप में स्वीकार किया जाएगा, बाकी कार्यान्वयन समान है। शेष कार्यान्वयन और यह एप्लिकेशन(application) पहले से अलग नहीं है। फर्क सिर्फ इतना है, इन तीन लाइनों में जहां हम फ्रेंड फंक्शन(friend function) का उपयोग करने के बजाय हम फ्रेंड क्लास(friend Class) का उपयोग कर रहे हैं। इसलिए, विशेष रूप से यदि दो वर्गों में बहुत से सदस्य कार्य करने हैं, तो हमें इस बात पर विचार करना चाहिए कि क्या व्यक्तिगत रूप से सदस्य कार्यों को फ्रेंड(friend) बनाने के बजाय, क्या आपको वास्तव में पूरी कक्षाओं को फ्रेंड(friend) बनाना चाहिए और इससे आपका जीवन आसान हो जाएगा क्योंकि आप विशेष रूप से फ्रेंड(friend) के रूप में सभी विभिन्न सदस्य कार्यों को सूचीबद्ध करने की आवश्यकता नहीं है। तो, अब आपने देखा है कि यह फ्रेंड(friend) सामग्री कैसे काम करती है। अब मुझे कुछ फ़्रींदली(friendly) नोड्स के साथ समाप्त करना है पहला बिंदु ध्यान देना है, दोस्ती है जब हम कहते हैं कि एक क्लास(class) एक दूसरे का दोस्त है यह दोस्ती दो वर्गों के बीच एक द्विआधारी संबंध की तरह है और यह द्विआधारी संबंध न तो है कम्यूटेटिव(commutative) न तो सकर्मक है। यह कम्यूटेटिव(commutative) नहीं है, जिसका अर्थ है कि यदि A, B का फ्रेंड(friend) है, तो इसका अर्थ यह नहीं है कि B, A का फ्रेंड(friend) है। यदि मुझे अगर, B को A का फ्रेंड(friend) बनाना है, तो A के क्लास(class) के दायरे मुझे फ्रेंड(friend) बी(B) को रखना होगा। क्लास(class) B यह कथन है, लेकिन केवल इस तथ्य से कि A, B का फ्रेंड(friend) है, का यह अर्थ नहीं है कि B, A का फ्रेंड(friend) है, इसलिए यह एक कम्यूटेटिव(commutative) संबंध नहीं है। इसी तरह, अगर मेरे पास A, B के फ्रेंड(friend) के रूप में है, B इन वर्गों के भीतर से C का फ्रेंड(friend) है, जिसका यह अर्थ नहीं है कि A, C का फ्रेंड(friend) है, इसलिए संक्रामकता काम नहीं करती है। दोस्ती सिर्फ बाइनरी है, बस दो वर्गों के बीच काम है और आगे कोई अनुमान संभव नहीं है। अब यह कहते हुए, कृपया ध्यान दें कि फ्रेंड फंक्शन(friend function) और फ्रेंड क्लास(friend Class) का यह फ्रेंड फीचर वास्तव में भाषा के इनकैप्सुलेशन(encapsulation) और विजिबिलिटी(visibility) स्ट्रक्चर(structure) को बदल देता है। अब तक हमारे पास तीन प्रकार की दृश्यता है, जिनमें से दो पर हमने पहले ही सार्वजनिक और निजी चर्चा की है, हम जल्द ही संरक्षित दृश्यता पर चर्चा करेंगे जो विरासत पर लागू होती है। लेकिन फ्रेंड(friend) एक चौथी तरह की दृश्यता है जो C++ में मौजूद है जहां आप विशेष रूप से एक क्लास(class) कुछ अन्य कक्षाएं बना सकते हैं, कुछ अन्य सदस्य एक दोस्त का काम करते हैं और इस तरह यह एक दृश्यता प्रदान करते हैं जो प्रतिबंधित है, लेकिन यहाँ पूरी तरह से इनकैप्सुलेशन(encapsulation) को पंचर करना है । तो, यह वही होना चाहिए जो आप फ्रेंड(friend) बनाते हैं, बहुत ही विवेकपूर्ण तरीके से किया जाना चाहिए क्योंकि यदि आप मनमाने ढंग से अन्य क्लास(class) और अन्य कार्य, वैश्विक कार्य या सदस्य कार्य को फ्रेंड(friend) बनाते हैं तब डेटा एन्कैप्सुलेट करने और सदस्य कार्यों के उचित विकल्प के माध्यम से उन्हें एक्सेस(access) करने का उपयोग करने के आपके सभी फायदे खो जाएंगे। इसलिए, यहाँ हमने कुछ स्थितियों को रखने की कोशिश की है जो सामान्य हैं जहाँ फ्रेंड(friend) का उपयोग करने वाला वास्तव में मदद करता है। पहले मैट्रिक्स(matrix) वेक्टर(vector) प्रकार की स्थिति होती है जहां आपके पास दो स्वतंत्र कक्षाएं होती हैं, लेकिन आपके पास एक कार्यक्षमता है जहां डेटा(data) सदस्य, इन दोनों वर्गों के निजी सदस्य एक वेक्टर(vector) के साथ मैट्रिक्स(matrix) को गुणा करने के मामले में भाग लेते हैं। या आपके पास एक ऐसी स्थिति है जहां एक क्लास(class) को डिजाइन के घटक के रूप में किसी अन्य क्लास(class) के शीर्ष पर बनाया जा रहा है जैसे सूची, सूची में विभिन्न नोड(node) क्लास(class) की वस्तुओं का समावेश होता है इसलिए यदि आप नोड(node) का उपयोग करते हैं तो सूची कार्यक्षमता निश्चित रूप से लागू करने के लिए बहुत आसान हो जाती है, अगर आप सूची को उसके फ्रेंड(friend) के रूप में घोषित करने के लिए नोड(node) ताकि वह सूची के संपूर्ण आंतरिक के माध्यम से देख सके। यह एक और स्थिति है। तीसरा, जिस पर हमने अभी तक चर्चा नहीं की है, लेकिन मैं सिर्फ एक संकेतक लगाऊंगा, जब हमने ऑपरेटरों को उनके कुछ ऑपरेटरों को अधिभारित करने की कोशिश की, जो कि उचित सिंटैक्स और शब्दार्थ के साथ अधिभार करना बहुत मुश्किल है, अगर हमारे पास फ्रेंड(friend) प्रकार की कार्यक्षमता उपलब्ध नहीं होती सी ++ मे। उदाहरण हम आउटपुट(output) इनपुट स्ट्रीमिंग ऑपरेटरों के संदर्भ में दिखाएंगे जब आप उन्हें विशिष्ट उपयोगकर्ता परिभाषित कक्षाओं के लिए अधिभार देते हैं, लेकिन सामान्य तौर पर आपको फ्रेंड(friend) फ़ंक्शन(function) और फ्रेंड क्लास(friend Class) का उपयोग करने के मामले में बहुत सतर्क, प्रतिबंधात्मक और रूढ़िवादी होना चाहिए और आपको वास्तव में सुनिश्चित करना चाहिए आपके पास इन विभिन्न स्थितियों में से एक है और यह वास्तव में होने वाली कुछ बहुत ही संबंधित स्थितियों में से एक हो सकती है, लेकिन अन्यथा यदि आप केवल समारोह के रूप में फ्रेंड(friend) सुविधा का उपयोग करते हैं या क्लास(class) के एक फ्रेंड(friend) के रूप में सिर्फ डिजाइन को शॉर्टकट करने के लिए करते हैं तो आप वास्तव में तोड़ रहे हैं एनकैप्सुलेशन(encapsulation) नीचे जो मूल वस्तु उन्मुख ढांचे के खिलाफ जाएगा, जिसे हम एक्सेस(access) विनिर्देशक की परिभाषा और वस्तुओं के निर्माण के माध्यम से इतनी सावधानी से बना रहे हैं। इसलिए, फ्रेंड(friend) एक शक्तिशाली विशेषता है और किसी भी शक्तिशाली विशेषता की तरह, किसी भी शक्तिशाली हथियार की तरह इसे बहुत सावधानी से और विवेक से इस्तेमाल किया जाना चाहिए। इस मॉड्यूल(module) में संक्षेप में हमने फ्रेंड फंक्शन(friend function) की धारणा और फ्रेंड क्लास(friend class) की धारणा को पेश किया है और हमने मैट्रिक्स(matrix) फंक्शन(function) और रिस्क हेरफेर के उदाहरणों के साथ फ्रेंड फंक्शन(friend function) और फ्रेंड क्लास(friend Class) का अध्ययन किया है, और हम विशेष रूप से उल्लेख किया है कि दोस्त एक अलग तरह की दृश्यता है और कुछ हद तक खतरनाक है, इसका उपयोग करने के लिए कुछ जोखिम भरा है क्योंकि यह मनमाने ढंग से इनकैप्सुलेशन(encapsulation) को तोड़ सकता है और इसलिए दोस्त का उपयोग उचित डिजाइन औचित्य के साथ डिजाइन के बहुत ही विवेकपूर्ण विकल्प के साथ किया जाना चाहिए कि यह विराम क्यों है की आवश्यकता है। जैसा कि आप आगे बढ़ते हैं और बहुत सारे डिजाइन और कार्यान्वयन करना शुरू करते हैं, हम उस तरह के लगभग हमेशा पाएंगे कि आपको एक फ्रेंड(friend) का उपयोग करने की आवश्यकता है यह उन तीन स्थितियों में से एक होगा जिसकी मैंने यहां चर्चा की है, और यदि आप पाते हैं कि आपको एक की आवश्यकता है फ्रेंड फंक्शन(friend function) या फ्रेंड क्लास(friend Class) ऐसी स्थिति में इस्तेमाल किया जाना चाहिए, जो उन तीनों की तरह नहीं है, जिनकी हमने चर्चा की है, तो आपको बहुत सतर्क और सावधान रहना चाहिए और वास्तव में खुद को समझाना चाहिए कि यह एक ऐसी स्थिति है, जिसके लिए फ्रेंड(friend) का इस्तेमाल करने की जरूरत है।