محددات الوصول C ++

C Access Specifiers



في C ++ ، الفئة عبارة عن مجموعة من المتغيرات والوظائف التي تم تكوينها للعمل معًا. عندما يتم إعطاء قيم متغيرات الفئة ، يتم الحصول على كائن. الكائن له نفس المتغيرات والوظائف كفئة ، ولكن هذه المرة ، المتغيرات لها قيم. يمكن إنشاء العديد من الكائنات من فئة واحدة. يختلف كائن واحد عن كائن آخر وفقًا لمجموعة مختلفة من القيم المخصصة لمتغيرات الكائن الآخر. يُقال إن إنشاء كائن من فئة ما يؤدي إلى إنشاء الكائن. حتى إذا كان هناك كائنان مختلفان لهما نفس القيم لمتغيراتهما ، فإن هذه الكائنات هي كيانات مختلفة ، يتم تحديدها بأسماء مختلفة في البرنامج. تسمى المتغيرات الخاصة بالكائن والفئة المقابلة لها أعضاء البيانات. تسمى وظائف الكائن وفئته المقابلة وظائف الأعضاء. أعضاء البيانات ووظائف الأعضاء تسمى أعضاء.

تعني كلمة الوصول قراءة أو تغيير قيمة المتغير ، كما تعني أيضًا استخدام دالة. محددات الوصول C ++ هي الكلمات الخاصة والمحمية والعامة. يقررون ما إذا كان يمكن للعضو الوصول إلى أعضاء آخرين من فئته ، أو إذا كان بإمكان وظيفة أو عامل خارج الفصل ولا ينتمي إلى الفصل الوصول إلى أي عضو في الفصل. يقررون أيضًا ما إذا كان يمكن لعضو في فئة مشتقة (تابعة) الوصول إلى عضو في فئة أصل.







مطلوب معرفة أساسية بـ C ++ لفهم هذه المقالة واختبار الكود المقدم.



محتوى المادة

المحددات العامة والخاصة

فصل
يمكن لأي عضو في الفصل الوصول إلى أي عضو آخر من نفس الفئة ، بغض النظر عن كونه عام أو خاص. ضع في اعتبارك البرنامج التالي:



#يشمل
استخدام مساحة الاسمساعات؛

صف دراسيTheCla
{
نشر:
intعدد 1؛
intعدد 2؛
عام:
TheCla(intn1 ،intn2)
{
عدد 1=n1؛عدد 2=n2؛
}
intطريقة()
{
إرجاععدد 1؛
}
}؛

intالأساسية()
{
TheCla obj(10وعشرين)؛
intno2=الهدف.طريقة()؛
كلفة<<no2<<'ن'؛

// int no1 = obj.num1 ؛

إرجاع 0؛
}

الناتج هو 10. الأعضاء الخاصون هم num1 و num2. أعضاء الجمهور هم TheCla () والطريقة (). لاحظ أن TheCla () هي دالة منشئ تقوم بتهيئة المتغيرات ذات الأهمية. تبدأ منطقة محدد الوصول من التسمية الخاصة به إلى نهاية وصف الفئة (التعريف) أو إلى بداية محدد وصول آخر.





في الدالة main () ، العبارة الأولى هي إنشاء مثيل يتضمن دالة المنشئ ، والتي تهيئ num1 و num2. يستدعي البيان التالي العضو العام ، الطريقة () ، من الفصل.

الآن ، في وصف الفصل (التعريف) ، تصل وظيفة العضو العام ، TheCla () ، إلى الأعضاء الخاصين ، num1 و num2. أيضًا ، تصل وظيفة العضو العام ، method () ، إلى العضو الخاص ، num1. يمكن لأي عضو ضمن وصف الفصل الوصول إلى أي عضو آخر ضمن نفس وصف الفصل الدراسي ؛ لا يهم أي عضو خاص أو عام.



ومع ذلك ، فإن الوظيفة أو المشغل غير المصرح به في وصف الفصل وخارج وصف الفصل الدراسي يمكنه الوصول فقط إلى الأعضاء العموميين في الفصل. الوظيفة الرئيسية () ، على سبيل المثال ، هي وظيفة تم الإعلان عنها خارج وصف الفئة. لقد كان قادرًا على الوصول إلى الطريقة () وأعضاء الجمهور TheCla () فقط. داخل الوظيفة الرئيسية () ، تكون الدالة TheCla () هي obj (10 ، 20).

لا يمكن لوظيفة خارجية أو عامل تشغيل خارجي ، مثل الوظيفة الرئيسية () ، الوصول إلى أي من أعضاء الفئة الخاصة ، مثل num1 أو num2. أزل مؤشر التعليق ، // ، من العبارة الأخيرة باستثناء واحدة في main (). إذا حاولت تجميع البرنامج ، فلاحظ أن البرنامج لن يقوم بالترجمة ، مما يعطي رسالة خطأ.

المحدد الافتراضي
المحدد الافتراضي للفئة هو خاص. إذن ، وصف الفئة أعلاه هو نفسه الوصف التالي ، خاص ، ولكن بدون المحدد:

صف دراسيTheCla
{
intعدد 1؛
intعدد 2؛
عام:
TheCla(intn1 ،intn2)
{
عدد 1=n1؛عدد 2=n2؛
}
intطريقة()
{
إرجاععدد 1؛
}
}؛

ملحوظة : تبدأ تسمية محدد الوصول بالمحدد ، ثم يتبعها نقطتان.

المحدد المحمي

ضمن وصف الفئة ، ومن وظيفة خارجية أو عامل خارجي ، يكون المحدد المحمي هو نفسه المحدد الخاص. الآن ، استبدل المحدد الخاص في البرنامج أعلاه بالمحدد ، واحمي ، وأزل مؤشر التعليق ، // ، من العبارة الأخيرة باستثناء واحد في الدالة main (). إذا حاولت تجميع البرنامج ، فلاحظ أن البرنامج لن يقوم بالترجمة ، مما يعطي رسالة خطأ.

تظهر مسألة المحدد المحمي عندما يتعين على أعضاء الفئة المشتقة (الموروثة) الوصول إلى أعضاء الفئة الأساسية (الأصل).

فئة عامة مشتقة مع الأعضاء العموميين
ضع في اعتبارك البرنامج التالي:

#يشمل
استخدام مساحة الاسمساعات؛

صف دراسيTheCla
{
عام:
intعدد 1= 10؛
محمي:
intعدد 2= عشرين؛
نشر:
intعدد 3= 30؛
}؛

صف دراسيتشايلد كلا: عامTheCla
{
عام:
intطريقة 1()
{
إرجاععدد 1؛
}
intطريقة 2()
{
إرجاععدد 2؛
}
/ * int method3 ()
{
عودة num3 ؛
} * /

}؛

intالأساسية()
{
ChildCla childObj؛
intرقم 1=طفلطريقة 1()؛
كلفة<<رقم 1<<'ن'؛

intno2=طفلطريقة 2()؛
كلفة<<no2<<'ن'؛

إرجاع 0؛
}

الإخراج:
10
عشرين

في الفئة الأساسية ، يكون num1 عامًا ، و num2 محميًا ، و num3 خاص. في الفئة المشتقة ، تكون جميع وظائف الأعضاء عامة. الوظيفة الأولى ، method1 () ، تصل إلى عضو البيانات العامة ، رقم 1. الوظيفة الثانية ، method2 () ، تصل إلى عضو البيانات المحمي ، num2. الوظيفة الثالثة ، method3 () ، على الرغم من التعليق عليها حاليًا ، يجب أن تصل إلى عضو البيانات الخاص ، num3.

لم يتم التصريح عن فئة مشتقة بدون محدد وصول (عام أو محمي أو خاص). أعلاه ، يتم التصريح عن الفئة المشتقة مع المحدد العام ، أي:

صف دراسيتشايلد كلا: عامTheCla{}

الآن قم بإلغاء التعليق على تعريف دالة العضو الثالث في الفئة المشتقة. إذا حاولت تجميع البرنامج ، فلاحظ أنه لن يتم تجميعه ، مما يعطي رسالة خطأ.

ملحوظة : عندما يتم الإعلان عن الفئة المشتقة بأكملها عامة ، لا يمكن لأعضائها الوصول إلى الأعضاء الخاصين من الفئة الأساسية. ومع ذلك ، يمكن لأعضائها الوصول إلى الجمهور والأعضاء المحميين من الفئة الأساسية. البرنامج أعلاه يوضح هذا.

ومع ذلك ، لاحظ أن عضوًا عامًا من الفئة المشتقة العامة يمكنه الوصول إلى عضو محمي من الفئة الأساسية.

محددات الفئة المشتقة ومحددات الأعضاء

فئة مشتقة محمية مع أعضاء عامة
استبدال المحدد العام بالمحمي في التصريح عن الصنف المشتق أعلاه ، على النحو التالي:

صف دراسيتشايلد كلا: محميTheCla{}

قم بتجميع البرنامج وتشغيله ولاحظ أن النتيجة هي نفسها كما كانت من قبل.

لذلك ، عندما يتم إعلان الفئة المشتقة بأكملها محمية ، لا يمكن لأعضائها الوصول إلى الأعضاء الخاصين من الفئة الأساسية. ومع ذلك ، يمكن لأعضائها الوصول إلى الجمهور والأعضاء المحميين من الفئة الأساسية. هذا هو نفسه عندما يتم إعلان الفئة المشتقة عامة.

ملحوظة : يمكن لعضو محمي من الفئة المشتقة العامة الوصول إلى عضو محمي من الفئة الأساسية.

فئة خاصة مشتقة مع أعضاء عامين
استبدل المحدد المحمي بالخاص في إعلان الفئة المشتقة أعلاه ، على النحو التالي:

صف دراسيتشايلد كلا: نشرTheCla{}

قم بتجميع البرنامج وتشغيله ولاحظ أن النتيجة هي نفسها كما كانت من قبل.

لذلك ، عندما يتم إعلان الفئة المشتقة بأكملها خاصة ، لا يمكن لأعضائها الوصول إلى الأعضاء الخاصين من الفئة الأساسية. ومع ذلك ، يمكن لأعضائها الوصول إلى الجمهور والأعضاء المحميين من الفئة الأساسية. هذا هو نفسه عندما يتم إعلان الفئة المشتقة محمية أو عامة.

فئة عامة مشتقة مع أعضاء محميين
اكتب وقم بترجمة وتشغيل البرنامج التالي ، حيث يتم حماية الفئة المشتقة بأكملها ، كما تتم حماية أعضائها. بعض أجزاء الكود هي كما يلي:

#يشمل
استخدام مساحة الاسمساعات؛

صف دراسيTheCla
{
عام:
intعدد 1= 10؛
محمي:
intعدد 2= عشرين؛
نشر:
intعدد 3= 30؛
}؛

صف دراسيتشايلد كلا: عامTheCla
{
محمي:
intطريقة 1()
{
إرجاععدد 1؛
}
intطريقة 2()
{
إرجاععدد 2؛
}
/ * int method3 ()
{
عودة num3 ؛
} * /

}؛

intالأساسية()
{
/ * ChildCla childObj ؛
int no1 = childObj.method1 () ،
كلفة<
/ * int no2 = childObj.method2 () ؛
كلفة<
إرجاع 0؛
}

يعمل البرنامج كما هو. لا يوجد إخراج ، وليس من المفترض أن يكون هناك أي إخراج ، بناءً على كيفية كتابة البرنامج.

الآن ، قم بإلغاء التعليق على تعريف الوظيفة ، method3 () ، في الفئة المشتقة. إذا حاولت تجميع البرنامج ، فلاحظ أنه لن يتم تجميعه ، مما يعطي رسالة خطأ. هذا يعني أنه لا يمكن الوصول إلى عضو خاص من وظيفة خارجية أو عامل خارجي أو فئة مشتقة. هذا هو نفس الاستنتاج الذي تم التوصل إليه أعلاه ، فيما يتعلق بالوصول إلى عضو خاص.

ملحوظة : يمكن لعضو محمي من الفئة المشتقة المحمية الوصول إلى عضو محمي من الفئة الأساسية.

الآن ، ضع التعليقات مرة أخرى في الفئة المشتقة وقم بإلغاء التعليق على مقطع الكود الأول في الوظيفة main (). إذا حاولت ترجمة البرنامج ، فلاحظ أن البرنامج لن يقوم بالتجميع بسبب مقطع الكود الأول في الوظيفة main (). هذا التأثير ليس جديدا. بصرف النظر عن الفئة المشتقة ، والوظائف الخارجية ، والمشغلين الخارجيين ، فإن الأعضاء المحميون والخاصون للفئة (الأساسية أو المشتقة) هم من نفس المحدد ، خاص. ترى الوظيفة main () العضو المحمي من أي فئة ، سواء كان أساسيًا أو مشتقًا ، من نفس المحدد ، خاصًا ، ويمنع من الوصول إليه.

إذا لم يتم التعليق على مقطع الكود الثاني لوظيفة main () ، فسيتم تطبيق نفس الشرح. بمعنى ، لن تتمكن الوظيفة الرئيسية () من الوصول إلى عضو محمي أو خاص من الفئة المشتقة أو الفئة الأساسية. هذا مستقل عما إذا كان يمكن لعضو محمي من الفئة المشتقة الوصول إلى عضو محمي من الفئة الأساسية.

فئة مشتقة محمية مع أعضاء محميين
استبدال المحدد العام بالمحمي في التصريح عن الصنف المشتق أعلاه ، على النحو التالي:

صف دراسيتشايلد كلا: محميTheCla{}

ضع تعليق مقاطع الكود مرة أخرى في الوظيفة الرئيسية () ، إذا لم يتم ذلك بالفعل. قم بتجميع البرنامج وتشغيله ولاحظ أن النتيجة كما كانت من قبل.

فئة خاصة مشتقة مع أعضاء محميين
استبدل المحدد المحمي بالخاص في إعلان الفئة المشتقة أعلاه ، على النحو التالي:

صف دراسيتشايلد كلا: نشرTheCla

قم بتجميع البرنامج وتشغيله ولاحظ أن النتيجة ستكون كما كانت من قبل.

فئة عامة مشتقة مع أعضاء خاصين
استبدل المحدد الخاص بـ public في التصريح عن الفئة المشتقة أعلاه ، على النحو التالي:

صف دراسيتشايلد كلا: عامTheCla{}

اجعل أعضاء الفئة المشتقة خاصة. ترجمة وتشغيل البرنامج. لا تختلف النتيجة عن حالة الفئة العامة المشتقة ذات الأعضاء المحميين.

فئة مشتقة محمية مع أعضاء خاصين
استبدال المحدد العام بالمحمي في التصريح عن الصنف المشتق أعلاه ، على النحو التالي:

صف دراسيتشايلد كلا: محميTheCla{}

ترجمة وتشغيل البرنامج. لا تختلف هذه النتيجة عن حالة الفئة المشتقة المحمية ذات الأعضاء المحميين.

فئة خاصة مشتقة مع أعضاء خاصين
استبدل المحدد المحمي بالخاص في إعلان الفئة المشتقة أعلاه ، على النحو التالي:

صف دراسيتشايلد كلا: نشرTheCla{}

ترجمة وتشغيل البرنامج. لا تختلف هذه النتيجة عن حالة الفئة الخاصة المشتقة ذات الأعضاء المحميين.

استنتاج

محددات الوصول C ++ هي الكلمات الخاصة والمحمية والعامة. قرروا الوصول لأعضاء الفصل. تبدأ منطقة محدد الوصول من التسمية الخاصة به ، إلى نهاية وصف الفئة (التعريف) ، أو إلى بداية محدد وصول آخر. يمكن لأي عضو في الفصل الوصول إلى أي عضو آخر من نفس الفئة. لا يمكن الوصول إلى عضو خاص في الفصل من خلال أي وظيفة خارجية أو أي مشغل خارجي أو فئة مشتقة.

يجب حماية عضو الفئة الأساسية بحيث يمكن الوصول إلى عضو خاص من الفئة الأساسية بواسطة عضو من الفئة المشتقة. يُنظر إلى هذا العضو المحمي من الفئة الأساسية كعضو خاص في الفئة الأساسية بواسطة وظيفة خارجية أو عامل خارجي.

يمكن الوصول إلى عضو عام في الفصل عن طريق أي وظيفة خارجية أو أي مشغل خارجي أو فئة مشتقة.

في حالة عدم وجود أي محدد وصول في فئة ، يتم افتراض المحدد الخاص. أي أن محدد الوصول الافتراضي هو خاص.

المراجع المستخدمة في هذا العمل