النطاق في C ++

Scope C



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

محتوى المادة

المنطقة والنطاق التصريحي

المنطقة التعريفية هي الجزء الأكبر من نص البرنامج الذي يكون فيه اسم الكيان صالحًا. إنها المنطقة التي يمكن فيها استخدام (مشاهدة) الاسم غير المؤهل للإشارة إلى نفس الكيان. ضع في اعتبارك البرنامج القصير التالي:







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

فارغالجبهة الوطنية()
{
intأين= 3؛
لو (1==1)
{
كلفة<<أين<<'ن'؛
}
}

intالأساسية()
{
الجبهة الوطنية()؛
إرجاع 0؛
}

تحتوي الوظيفة fn () على كتلتين: كتلة داخلية لشرط if وكتلة خارجية لجسم الوظيفة. المعرف var ، يتم تقديمه ومشاهدته في الكتلة الخارجية. يظهر أيضًا في الكتلة الداخلية ، مع بيان cout. الكتل الخارجية والداخلية كلاهما نطاق الاسم var.



ومع ذلك ، لا يزال من الممكن استخدام الاسم var للإعلان عن كيان مختلف مثل عدد عشري في الكتلة الداخلية. يوضح الكود التالي هذا:



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

فارغالجبهة الوطنية()
{
intأين= 3؛
لو (1==1)
{
تطفوأين= 7.5؛
كلفة<<أين<<'ن'؛
}
}

intالأساسية()
{
الجبهة الوطنية()؛
إرجاع 0؛
}

الناتج 7.5. في هذه الحالة ، لم يعد من الممكن استخدام الاسم var في الكتلة الداخلية للإشارة إلى العدد الصحيح للقيمة 3 ، والذي تم تقديمه (المعلن) في الكتلة الخارجية. يشار إلى هذه الكتل الداخلية على أنها نطاق محتمل للكيانات المعلنة في الكتلة الخارجية.





ملاحظة: لا يزال من الممكن التصريح عن كيان من نفس النوع ، مثل الكيان الخارجي ، في الكتلة الداخلية. ومع ذلك ، في هذه الحالة ، فإن ما يصح في الكتلة الداخلية هو الإعلان الجديد ومعناه ، بينما يظل الإعلان القديم ومعناه خارج الكتلة الداخلية ساريًا في الكتلة الخارجية.

عادةً ما يتجاوز الإعلان عن نفس الاسم في الكتلة الداخلية الإعلان عن نفس الاسم خارج تلك الكتلة الداخلية. يمكن أن تتداخل الكتل الداخلية مع الكتل الداخلية الأخرى.



النطاق العالمي

عندما يبدأ المبرمج في كتابة ملف ، فهذا هو النطاق العام. يوضح البرنامج القصير التالي هذا:

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

تطفوأين= 9.4؛

intالأساسية()
{
كلفة <<أين<<'ن'؛
كلفة <<::أين<<'ن'؛

إرجاع 0؛
}

الخرج هو:
9.4
9.4

في هذه الحالة ، تبدأ المنطقة أو النطاق التوضيحي لـ var من نقطة الإعلان عن var ، وتستمر نزولاً حتى نهاية الملف (وحدة الترجمة).

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

ملاحظة: الكيان ، main () ، مُعلن أيضًا في النطاق العالمي.

نطاق الكتلة

يمكن لكل من عبارة if أو while أو do أو for أو switch أن تحدد كتلة. مثل هذا البيان هو بيان مركب. اسم المتغير المعلن في كتلة له نطاق الكتلة. يبدأ نطاقه عند نقطة إعلانه وينتهي في نهاية الكتلة الخاصة به. البرنامج القصير التالي يوضح هذا للمتغير ، ident:

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

intالأساسية()
{
لو (1==1)
{
/ * بعض العبارات * /
intالهوية= 5؛
كلفة<<الهوية<<'ن'؛
/ * بعض العبارات * /
}
إرجاع 0؛
}

المتغير ، مثل معرف ، المُعلن عنه في نطاق الكتلة هو متغير محلي.

يمكن رؤية المتغير المعلن خارج نطاق الكتلة وما فوقه في رأس الكتلة (على سبيل المثال ، شرط if-block) وأيضًا داخل الكتلة. البرنامج القصير التالي يوضح هذا للمتغير ، identif:

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

intالأساسية()
{
intمعرف= 8؛

لو (معرف== 8)
{
كلفة<<معرف<<'ن'؛
}
إرجاع 0؛
}

الناتج هو 8. هناك نوعان من نطاقات الكتلة هنا: كتلة الدالة main () وعبارة if-composite المتداخلة. الكتلة المتداخلة هي النطاق المحتمل لكتلة الوظيفة الرئيسية ().

لا يمكن رؤية الإعلان المقدم في نطاق الكتلة خارج الكتلة. البرنامج القصير التالي ، الذي لا يترجم ، يوضح ذلك مع المتغير varab:

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

intالأساسية()
{
لو (1 == 1)
{
intفارياب= خمسة عشر؛
}
كلفة<<فارياب<<'ن'؛ // خطأ: تم الوصول إليه خارج نطاقه.

إرجاع 0؛
}

ينتج المترجم رسالة خطأ لـ varab.

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

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

intالأساسية()
{
ل (intأنا=0؛أنا<4؛ ++أنا)
{
كلفة<<أنا<<'؛
}
كلفة<<أنا<<'؛

إرجاع 0؛
}

يُرى متغير التكرار ، i ، داخل كتلة الحلقة ولكن ليس خارج كتلة الحلقة.

نطاق الوظيفة

تظهر معلمة الوظيفة في كتلة الوظيفة. يُنظر إلى الكيان المُعلن في كتلة دالة من نقطة الإعلان إلى نهاية كتلة الوظيفة. يوضح البرنامج القصير التالي هذا:

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

سلسلة fn(سلسلة سلسلة)
{
شارستريب[] = 'موز'؛
/ * بيانات أخرى * /
السلسلة totalStr=ص+ستريب؛
إرجاعالمجموع؛
}

intالأساسية()
{
سلسلة totStr=الجبهة الوطنية('يتناول الطعام ')؛
كلفة<<توتستر<<'ن'؛

إرجاع 0؛
}

الخرج هو:
أكل الموز

ملاحظة: يمكن رؤية الكيان الذي تم الإعلان عنه خارج الوظيفة (أعلاه) في قائمة معلمات الوظيفة وأيضًا في كتلة الوظيفة.

ملصق

نطاق التسمية هو الوظيفة التي تظهر فيها. يوضح الكود التالي هذا:

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

فارغالجبهة الوطنية()
{
اذهب إلىالتسمية؛
/ * بيانات أخرى * /
التسمية: intليس= 2؛
كلفة<<ليس<<'ن'؛
}

intالأساسية()
{
الجبهة الوطنية()؛

إرجاع 0؛
}

الخرج هو 2.

نطاق العد

تعداد غير محدد النطاق
ضع في اعتبارك ما يلي:

لو (1==1)
{
تعداد {أ ، ب ، ج=ب+2}؛
كلفة<<إلى<<'<<ب<<'<<ج<<'ن'؛
}

الناتج هو 0 1 3.

السطر الأول في الكتلة هو العد ، a و b و c هم العدادين الخاصين به. يبدأ نطاق العداد من نقطة الإعلان إلى نهاية الكتلة المرفقة للتعداد.

لن يتم تجميع العبارة التالية لأن نقطة إعلان c تكون بعد تلك الخاصة بـ a:

تعداد {إلى=ج+2، ب ، ج}؛

لن يتم تجميع مقطع الكود التالي لأنه يتم الوصول إلى العدادين بعد كتلة التضمين في التعداد:

لو (1==1)
{
تعداد {أ ، ب ، ج=ب+2}؛
}
كلفة<<إلى<<'<<ب<<'<<ج<<'ن'؛ // خطأ: خارج النطاق

يتم وصف التعداد أعلاه على أنه تعداد غير محدد النطاق ، ويتم وصف العدادين الخاصين به على أنهم عدادات بدون نطاق. هذا لأنه يبدأ فقط بالكلمة المحجوزة ، enum. توصف التعدادات التي تبدأ بفئة التعداد أو بنية التعداد على أنها تعداد نطاقي. يتم وصف العدادين الخاصين بهم على أنهم عدادات نطاق.

تعداد محدد النطاق
البيان التالي مقبول:

تعداد صف دراسيالذكر{أ ، ب ، ج=ب+2}؛

هذا مثال على تعداد محدد النطاق. اسم الفصل هو نام. هنا ، يبدأ نطاق العداد من نقطة الإعلان إلى نهاية تعريف التعداد ، وليس نهاية الكتلة المرفقة للتعداد. لن يتم ترجمة الكود التالي:

لو (1==1)
{
تعداد صف دراسيالذكر{أ ، ب ، ج=ب+2}؛
كلفة<<إلى<<'<<ب<<'<<ج<<'ن'؛ // خطأ: خارج نطاق فئة التعداد أو بنية التعداد
}

نطاق الفئة

مع تحديد النطاق العادي ، تبدأ المنطقة التقريرية من نقطة ، ثم تستمر وتتوقف عند نقطة مختلفة. النطاق موجود في منطقة واحدة مستمرة. باستخدام الفئة ، يمكن أن يكون نطاق الكيان في مناطق مختلفة غير مرتبطة معًا. لا تزال قواعد الكتل المتداخلة سارية. البرنامج التالي يوضح هذا:

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

// الفئة الأساسية
صف دراسيكلا
{
نشر:
intميمب= 5؛
محمي:
intmemPro= 9؛
عام:
فارغالجبهة الوطنية()
{
كلفة<<ميمب<<'ن'؛
}
}؛

//فئة مشتقة
صف دراسيديركلا: عامكلا
{
عام:
intderMem=memPro؛
}؛
intالأساسية()
{
كلا أوبج؛
الهدف.الجبهة الوطنية()؛
DerCla derObj؛
كلفة<<derObj.derMem<<'ن'؛

إرجاع 0؛
}

الخرج هو:
5
9

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

في الفئة Cla ، يُنظر إلى المتغير memPro عند نقطة الإعلان. يتم تخطي جزء الوظيفة العامة fn () ، ثم يتم رؤيته في كتلة وصف الفئة المشتقة. يتم رؤيته مرة أخرى لأسفل في الوظيفة الرئيسية ().

عامل تحليل النطاق
عامل تحليل النطاق في C ++ هو ::. يتم استخدامه للوصول إلى عضو ثابت في الفصل. البرنامج التالي يوضح هذا:

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

صف دراسيكلا
{
عام:
ثابتة int مقدار ثابتانا انا= 5؛
عام:
ثابتة فارغالجبهة الوطنية()
{
كلفة<<انا انا<<'ن'؛
}
}؛
intالأساسية()
{
كلفة<<كلا::انا انا<<'ن'؛
كلا::الجبهة الوطنية()؛

إرجاع 0؛
}

الخرج هو:
5
5

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

نطاق معلمة القالب

يبدأ النطاق العادي لاسم معلمة القالب من نقطة الإعلان إلى نهاية الكتلة الخاصة به ، كما في الكود التالي:

نموذج<أكتب اسمتي ،أكتب اسميو> هيكلالأعمار
{
تي جون= أحد عشر؛
أنت بيتر= 12.3؛
تي ماري= 13؛
يو جوي= 14.6؛
}؛

يتم رؤية U و T داخل الكتلة.

بالنسبة للنموذج الأولي لوظيفة القالب ، يبدأ النطاق من نقطة الإعلان إلى نهاية قائمة معلمات الوظيفة ، كما في العبارة التالية:

نموذج<أكتب اسمتي ،أكتب اسميو> فارغوظيفة(أنت لا ، أنت تشا ،مقدار ثابت شار *ص)؛

ومع ذلك ، عندما يتعلق الأمر بوصف الفئة (التعريف) ، يمكن أن يكون النطاق أيضًا من أجزاء مختلفة كما في الكود التالي:

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

نموذج<صف دراسيتي ،صف دراسييو> صف دراسيTheCla
{
عام:
عدد ر؛
ثابتةيو الفصل؛

فارغوظيفة(يو الأب ،مقدار ثابت شار *ص)
{
كلفة << 'يوجد ' <<على واحد<< 'كتب تستحق' <<لا<<ص<< ' في المتجر.' << 'ن'؛
}
ثابتة فارغمرح(يو الفصل)
{
لو (الفصل== 'إلى')
كلفة << 'وظيفة العضو الرسمية الثابتة' << 'ن'؛
}
}؛

intالأساسية()
{
TheCla<intوشار>الهدف؛
الهدف.على واحد = 12؛
الهدف.وظيفة('$'و'500')؛

إرجاع 0؛
}

إخفاء الاسم

مثال على إخفاء الاسم يحدث عندما يتم إعادة الإعلان عن اسم نفس نوع الكائن في كتلة متداخلة. البرنامج التالي يوضح هذا:

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

فارغالجبهة الوطنية()
{
intأين= 3؛
لو (1==1)
{
intأين= 4؛
كلفة<<أين<<'ن'؛
}
كلفة<<أين<<'ن'؛
}

intالأساسية()
{
الجبهة الوطنية()؛
إرجاع 0؛
}

الخرج هو:
4
3

ذلك لأن var في الكتلة المتداخلة أخفى var في الكتلة الخارجية.

إمكانية تكرار الإقرار في نفس النطاق

الهدف من الإعلان هو مكان إدخال الاسم (لأول مرة) في نطاقه.

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

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

فارغالجبهة الوطنية(intعلى واحد)؛
فارغالجبهة الوطنية(intعلى واحد)؛

فارغالجبهة الوطنية(intعلى واحد)
{
كلفة<<على واحد<<'ن'؛
}

intالأساسية()
{
الجبهة الوطنية(5)؛

إرجاع 0؛
}

البرنامج يعمل.

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

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

فارغالجبهة الوطنية(intعلى واحد)
{
كلفة<<على واحد<<'ن'؛
}

فارغالجبهة الوطنية(تطفولا)
{
كلفة<<لا<<'ن'؛
}

intالأساسية()
{
الجبهة الوطنية(5)؛
تطفوflt= 8.7؛
الجبهة الوطنية(flt)؛

إرجاع 0؛
}

الخرج هو:
5
8.7

تم تحديد الوظائف المثقلة في النطاق العالمي.

نطاق Namespace

يستحق Namespace Scope مقالته الخاصة. تمت كتابة المقال المذكور لهذا الموقع ، linuxhint.com. فقط اكتب كلمات البحث Namespace Scope في مربع البحث في هذا الموقع (الصفحة) وانقر فوق 'موافق' ، وستحصل على المقالة.

نطاق في أجزاء مختلفة

الفصل ليس هو المخطط الوحيد حيث يمكن أن يكون النطاق في أجزاء مختلفة. محدد الصديق ، واستخدامات معينة لمُحدد النوع المفصل ، وتوجيهات الاستخدام هي مخططات أخرى حيث يكون النطاق في أماكن مختلفة - للحصول على التفاصيل ، انظر لاحقًا.

استنتاج

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