C ++ میں دائرہ کار۔

Scope C



C ++ میں ایک ہستی کا ایک نام ہوتا ہے ، جسے قرار دیا جا سکتا ہے اور/یا بیان کیا جا سکتا ہے۔ ایک اعلان ایک تعریف ہے ، لیکن ایک تعریف ضروری نہیں کہ ایک اعلان ہو۔ ایک تعریف نامی ہستی کے لیے میموری مختص کرتی ہے ، لیکن ایک اعلان نامی ہستی کے لیے میموری مختص کر سکتا ہے یا نہیں۔ ایک اعلانیہ علاقہ ایک پروگرام کا سب سے بڑا حصہ ہے جس میں کسی ہستی (متغیر) کا نام درست ہے۔ اس علاقے کو دائرہ کار یا ممکنہ دائرہ کہا جاتا ہے۔ یہ مضمون C ++ میں اسکوپنگ کی وضاحت کرتا ہے۔ مزید برآں ، اس مضمون کو سمجھنے کے لیے C ++ میں بنیادی علم کی ضرورت ہے۔

مضمون کا مواد۔

اعلانیہ علاقہ اور دائرہ کار۔

ایک اعلانیہ علاقہ پروگرام کے متن کا سب سے بڑا حصہ ہے جس میں کسی ہستی کا نام درست ہوتا ہے۔ یہ وہ علاقہ ہے جہاں نااہل نام استعمال کیا جا سکتا ہے (دیکھا گیا) اسی ہستی کا حوالہ دینے کے لیے۔ مندرجہ ذیل مختصر پروگرام پر غور کریں:







#شامل کریں
استعمال کرتے ہوئے نام کی جگہگھنٹے؛

باطلfn()
{
intکہاں= ؛
اگر (==)
{
لاگت<<کہاں<<'n'؛
}
}

intمرکزی()
{
fn()؛
واپسی ؛
}

فنکشن fn () کے دو بلاکس ہیں: اگر حالت کے لیے اندرونی بلاک اور فنکشن باڈی کے لیے بیرونی بلاک۔ شناخت کنندہ ، var ، متعارف کرایا جاتا ہے اور بیرونی بلاک میں دیکھا جاتا ہے۔ یہ کوٹ اسٹیٹمنٹ کے ساتھ اندرونی بلاک میں بھی دیکھا جاتا ہے۔ بیرونی اور اندرونی بلاکس دونوں نام کی گنجائش ہیں ، var۔



تاہم ، نام ، var ، اب بھی ایک مختلف ہستی کا اعلان کرنے کے لیے استعمال کیا جا سکتا ہے جیسے اندرونی بلاک میں فلوٹ۔ مندرجہ ذیل کوڈ اس کی وضاحت کرتا ہے:



#شامل کریں
استعمال کرتے ہوئے نام کی جگہگھنٹے؛

باطلfn()
{
intکہاں= ؛
اگر (==)
{
تیرناکہاں= 7.5۔؛
لاگت<<کہاں<<'n'؛
}
}

intمرکزی()
{
fn()؛
واپسی ؛
}

پیداوار 7.5 ہے۔ اس صورت میں ، نام ، var ، اب اندرونی بلاک میں ویلیو 3 کے عدد کا حوالہ دینے کے لیے استعمال نہیں کیا جا سکتا ، جو کہ بیرونی بلاک میں متعارف کرایا گیا تھا۔ اس طرح کے اندرونی بلاکس کو بیرونی بلاک میں اعلان کردہ اداروں کی ممکنہ گنجائش کہا جاتا ہے۔





نوٹ: بیرونی بلاک کی طرح ایک ہی قسم کی ہستی کو اب بھی اندرونی بلاک میں قرار دیا جا سکتا ہے۔ تاہم ، اس معاملے میں ، جو اندرونی بلاک میں درست ہے وہ ہے نیا اعلان اور اس کا مطلب ، جبکہ پرانا اعلامیہ اور اندرونی بلاک کے باہر کے معنی بیرونی بلاک میں درست رہتے ہیں۔

اندرونی بلاک میں ایک ہی نام کا اعلان عام طور پر اس اندرونی بلاک کے باہر اسی نام کے اعلان کو اوور رائیڈ کرتا ہے۔ اندرونی بلاکس دوسرے اندرونی بلاکس کو گھونسلا سکتے ہیں۔



عالمی دائرہ کار

جب ایک پروگرامر صرف فائل ٹائپ کرنا شروع کرتا ہے ، تو یہ عالمی دائرہ کار ہے۔ مندرجہ ذیل مختصر پروگرام اس کی وضاحت کرتا ہے:

#شامل کریں
استعمال کرتے ہوئے نام کی جگہگھنٹے؛

تیرناکہاں= 9.4۔؛

intمرکزی()
{
لاگت <<کہاں<<'n'؛
لاگت <<::کہاں<<'n'؛

واپسی ؛
}

پیداوار یہ ہے:
9.4۔
9.4۔

اس صورت میں ، اعلانیہ علاقہ یا var کی گنجائش var کے اعلان کے نقطہ نظر سے شروع ہوتی ہے ، فائل کے اختتام تک نیچے تک جاری رہتی ہے (ترجمہ یونٹ)۔

مرکزی () فنکشن کا بلاک ایک مختلف دائرہ کار ہے۔ یہ عالمی دائرہ کار کے لیے ایک گنجائش ہے۔ عالمی دائرہ کار کی ایک ہستی تک رسائی حاصل کرنے کے لیے ، ایک مختلف دائرہ کار سے ، شناخت کنندہ براہ راست استعمال کیا جاتا ہے یا اس سے پہلے اسکوپ ریزولوشن آپریٹر ، ::۔

نوٹ: ہستی ، main () کو عالمی دائرہ کار میں بھی قرار دیا گیا ہے۔

بلاک اسکوپ۔

if، while، do، for، or switch statement ہر ایک بلاک کی وضاحت کر سکتا ہے۔ اس طرح کا بیان ایک جامع بیان ہے۔ بلاک میں اعلان کردہ متغیر کا نام بلاک کی گنجائش رکھتا ہے۔ اس کا دائرہ اس کے اعلان کے نقطہ سے شروع ہوتا ہے اور اس کے بلاک کے اختتام پر ختم ہوتا ہے۔ مندرجہ ذیل مختصر پروگرام متغیر ، شناخت کے لیے اس کی وضاحت کرتا ہے:

#شامل کریں
استعمال کرتے ہوئے نام کی جگہگھنٹے؛

intمرکزی()
{
اگر (==)
{
/*کچھ بیانات*/
intشناخت= ؛
لاگت<<شناخت<<'n'؛
/*کچھ بیانات*/
}
واپسی ؛
}

ایک متغیر ، جیسے شناخت ، بلاک دائرہ کار میں اعلان کیا گیا ایک مقامی متغیر ہے۔

بلاک کے دائرہ کار سے باہر اور اس کے اوپر ایک متغیر کو بلاک کے ہیڈر میں دیکھا جا سکتا ہے (مثال کے طور پر ، اگر بلاک کی حالت) اور بلاک کے اندر بھی۔ مندرجہ ذیل مختصر پروگرام متغیر ، شناخت کے لیے اس کی وضاحت کرتا ہے:

#شامل کریں
استعمال کرتے ہوئے نام کی جگہگھنٹے؛

intمرکزی()
{
intشناخت= ؛

اگر (شناخت== )
{
لاگت<<شناخت<<'n'؛
}
واپسی ؛
}

آؤٹ پٹ 8 ہے۔ یہاں دو بلاک اسکوپ ہیں: مین () فنکشن کے لیے بلاک اور نیسٹڈ اگر کمپاؤنڈ اسٹیٹمنٹ۔ نیسٹڈ بلاک مین () فنکشن بلاک کا ممکنہ دائرہ کار ہے۔

بلاک کے دائرہ کار میں متعارف کرائے گئے اعلان کو بلاک سے باہر نہیں دیکھا جا سکتا۔ مندرجہ ذیل مختصر پروگرام ، جو مرتب نہیں کرتا ، اسے متغیر ، variab کے ساتھ واضح کرتا ہے۔

#شامل کریں
استعمال کرتے ہوئے نام کی جگہگھنٹے؛

intمرکزی()
{
اگر ( == )
{
intمختلف= پندرہ؛
}
لاگت<<مختلف<<'n'؛ // خرابی: اس کے دائرہ کار سے باہر تک رسائی۔

واپسی ؛
}

مرتب کرنے والا variab کے لیے ایک غلطی کا پیغام تیار کرتا ہے۔

کمپاؤنڈ فنکشن کے ہیڈر میں اعلان کردہ ایک ہستی ، کمپاؤنڈ اسٹیٹمنٹ کے باہر (نیچے) نہیں دیکھی جا سکتی۔ مندرجہ ذیل لوپ کوڈ مرتب نہیں ہوگا ، جس کے نتیجے میں ایک غلطی کا پیغام ہوگا:

#شامل کریں
استعمال کرتے ہوئے نام کی جگہگھنٹے؛

intمرکزی()
{
کے لیے (intمیں=؛میں<؛ ++۔میں)
{
لاگت<<میں<<''؛
}
لاگت<<میں<<''؛

واپسی ؛
}

تکرار متغیر ، i ، فار لوپ بلاک کے اندر دیکھا جاتا ہے لیکن فار لوپ بلاک کے باہر نہیں۔

فنکشن کا دائرہ کار

فنکشن بلاک میں ایک فنکشن پیرامیٹر دیکھا جاتا ہے۔ فنکشن بلاک میں اعلان کردہ ایک ہستی کو اعلان کے نقطہ سے فنکشن بلاک کے اختتام تک دیکھا جاتا ہے۔ مندرجہ ذیل مختصر پروگرام اس کی وضاحت کرتا ہے:

#شامل کریں
#شامل کریں
استعمال کرتے ہوئے نام کی جگہگھنٹے؛

سٹرنگ ایف این(سٹرنگ)
{
چارسٹرائی[] = 'کیلے'؛
/*دیگر بیانات*/
سٹرنگ totalStr=p+سٹرائی؛
واپسیٹوٹل ایس ٹی آر؛
}

intمرکزی()
{
سٹرنگ totStr=fn('کھانا ')؛
لاگت<<totStr<<'n'؛

واپسی ؛
}

پیداوار یہ ہے:
کیلے کھانا

نوٹ: فنکشن کے باہر اعلان کردہ ایک ادارہ (اس کے اوپر) فنکشن پیرامیٹر لسٹ میں اور فنکشن بلاک میں بھی دیکھا جا سکتا ہے۔

لیبل

لیبل کا دائرہ وہ فنکشن ہے جس میں یہ ظاہر ہوتا ہے۔ مندرجہ ذیل کوڈ اس کی وضاحت کرتا ہے:

#شامل کریں
استعمال کرتے ہوئے نام کی جگہگھنٹے؛

باطلfn()
{
کے پاس جاؤلیبل؛
/*دیگر بیانات*/
لیبل: intنہیں= ؛
لاگت<<نہیں<<'n'؛
}

intمرکزی()
{
fn()؛

واپسی ؛
}

پیداوار 2 ہے۔

گنتی کا دائرہ کار

غیر محتاط گنتی۔
مندرجہ ذیل if-block پر غور کریں:

اگر (==)
{
enum {a، b، c=ب+}؛
لاگت<<کو<<''<<ب<<''<<ج<<'n'؛
}

پیداوار 0 1 3 ہے۔

بلاک میں پہلی لائن ایک گنتی ہے ، a ، b ، اور c اس کے گنتی کرنے والے ہیں۔ گنتی کرنے والے کا دائرہ اعلان کے نقطہ نظر سے شروع ہوتا ہے جو گنتی کے منسلک بلاک کے اختتام تک ہوتا ہے۔

مندرجہ ذیل بیان مرتب نہیں ہوگا کیونکہ c کے اعلان کا نقطہ a کے بعد ہے:

enum {کو=ج+، ب ، ج۔}؛

درج ذیل کوڈ طبقہ مرتب نہیں ہوگا کیونکہ گنتی کرنے والوں کو گنتی کے منسلک بلاک کے بعد حاصل کیا جاتا ہے۔

اگر (==)
{
enum {a، b، c=ب+}؛
}
لاگت<<کو<<''<<ب<<''<<ج<<'n'؛ // خرابی: دائرہ کار سے باہر

مذکورہ بالا گنتی کو ایک غیر محفوظ گنتی کے طور پر بیان کیا گیا ہے ، اور اس کے گنتی کرنے والوں کو غیر محفوظ گنتی کے طور پر بیان کیا گیا ہے۔ اس کی وجہ یہ ہے کہ یہ صرف مخصوص لفظ ، enum سے شروع ہوتا ہے۔ گنتی جو اینوم کلاس یا اینم ڈھانچے سے شروع ہوتی ہے اسے اسکوپڈ گنتی کے طور پر بیان کیا جاتا ہے۔ ان کے گنتی کرنے والوں کو دائرہ کار شمار کرنے والے کہا جاتا ہے۔

دائرہ کار شمار
مندرجہ ذیل بیان ٹھیک ہے:

enum کلاسمرد{a، b، c=ب+}؛

یہ ایک گنجائش کی ایک مثال ہے۔ کلاس کا نام نام ہے۔ یہاں ، گنتی کرنے والے کا دائرہ اعلان کے نقطہ نظر سے شروع ہوتا ہے گنتی کی تعریف کے اختتام تک ، نہ کہ گنتی کے لئے منسلک بلاک کے اختتام تک۔ درج ذیل کوڈ مرتب نہیں ہوگا:

اگر (==)
{
enum کلاسمرد{a، b، c=ب+}؛
لاگت<<کو<<''<<ب<<''<<ج<<'n'؛ // خرابی: enum کلاس یا enum struct کی گنجائش سے باہر۔
}

کلاس کا دائرہ کار۔

عام دائرہ کار کے ساتھ ، اعلانیہ علاقہ ایک نقطہ سے شروع ہوتا ہے ، پھر جاری رہتا ہے اور ایک مختلف مقام پر رک جاتا ہے۔ گنجائش ایک مسلسل علاقے میں موجود ہے۔ کلاس کے ساتھ ، ایک ہستی کا دائرہ کار مختلف علاقوں میں ہو سکتا ہے جو ایک دوسرے کے ساتھ شامل نہیں ہوتے ہیں۔ نیسٹڈ بلاکس کے قوانین اب بھی لاگو ہوتے ہیں۔ مندرجہ ذیل پروگرام اس کی وضاحت کرتا ہے:

#شامل کریں
استعمال کرتے ہوئے نام کی جگہگھنٹے؛

// بیس کلاس۔
کلاسکلا۔
{
نجی:
intmemP= ؛
محفوظ:
intmemPro= ؛
عوام:
باطلfn()
{
لاگت<<memP<<'n'؛
}
}؛

// ماخوذ کلاس۔
کلاسڈیرکلا۔: عوامکلا۔
{
عوام:
intderMem=memPro؛
}؛
intمرکزی()
{
کلا obj؛
objfn()؛
DerCla derObj؛
لاگت<<derObj.derMem<<'n'؛

واپسی ؛
}

پیداوار یہ ہے:

کلاس کلا میں ، متغیر memP ، اعلان کے مقام پر دیکھا جاتا ہے۔ اس کے بعد ، محفوظ کا مختصر حصہ چھوڑ دیا جاتا ہے ، پھر کلاس ممبر فنکشن بلاک میں دوبارہ دیکھا جاتا ہے۔ اخذ کردہ کلاس کو چھوڑ دیا جاتا ہے ، پھر مین () فنکشن اسکوپ (بلاک) پر دوبارہ دیکھا جاتا ہے۔

کلاس کلا میں ، متغیر memPro ، اعلان کے مقام پر دیکھا جاتا ہے۔ عوامی فنکشن fn () کا حصہ چھوڑ دیا جاتا ہے ، پھر اخذ کردہ کلاس تفصیل بلاک میں دیکھا جاتا ہے۔ یہ مین () فنکشن میں دوبارہ نیچے دیکھا گیا ہے۔

اسکوپ ریزولوشن آپریٹر۔
C ++ میں اسکوپ ریزولوشن آپریٹر :: ہے۔ یہ کلاس کے مستحکم رکن تک رسائی کے لیے استعمال ہوتا ہے۔ مندرجہ ذیل پروگرام اس کی وضاحت کرتا ہے:

#شامل کریں
استعمال کرتے ہوئے نام کی جگہگھنٹے؛

کلاسکلا۔
{
عوام:
جامد int constمیم= ؛
عوام:
جامد باطلfn()
{
لاگت<<میم<<'n'؛
}
}؛
intمرکزی()
{
لاگت<<کلا۔::میم<<'n'؛
کلا۔::fn()؛

واپسی ؛
}

پیداوار یہ ہے:

جامد اراکین مین () فنکشن بلاک میں دیکھے جاتے ہیں ، اسکوپ ریزولوشن آپریٹر کا استعمال کرتے ہوئے ان تک رسائی حاصل کی جاتی ہے۔

سانچہ پیرامیٹر کا دائرہ کار۔

ٹیمپلیٹ پیرامیٹر کے نام کا عام دائرہ اعلان کے نقطہ نظر سے اس کے بلاک کے اختتام تک شروع ہوتا ہے ، جیسا کہ درج ذیل کوڈ میں ہے:

سانچے<ٹائپ نامٹی ،ٹائپ نامU> ساختعمریں
{
ٹی جان۔= گیارہ؛
تم پیٹر۔= 12.3۔؛
ٹی مریم۔= 13۔؛
یو خوشی= 14.6۔؛
}؛

U اور T بلاک کے اندر نظر آتے ہیں۔

ٹیمپلیٹ فنکشن پروٹوٹائپ کے لیے ، دائرہ کار اعلان کے نقطہ سے فنکشن پیرامیٹر لسٹ کے اختتام تک شروع ہوتا ہے ، جیسا کہ مندرجہ ذیل بیان میں ہے:

سانچے<ٹائپ نامٹی ،ٹائپ نامU> باطلفنکشن(آپ نہیں ، آپ ،const چار *p)؛

تاہم ، جب کلاس کی تفصیل (تعریف) کی بات آتی ہے تو ، دائرہ کار مختلف حصوں کا بھی ہو سکتا ہے جیسا کہ درج ذیل کوڈ میں ہے۔

#شامل کریں
استعمال کرتے ہوئے نام کی جگہگھنٹے؛

سانچے<کلاسٹی ،کلاسU> کلاسTheCla
{
عوام:
ٹی نمبر؛
جامدیو چودھری؛

باطلفنکشن(اے باپ ،const چار *p)
{
لاگت << 'وہاں ہے ' <<ایک پر<< کتابوں کی قیمت <<نہیں<<p<< 'اسٹور میں۔' << 'n'؛
}
جامد باطلمزہ(یو چودھری)
{
اگر (چودھری== 'سے')
لاگت << 'سرکاری جامد رکن کی تقریب' << 'n'؛
}
}؛

intمرکزی()
{
TheCla<int،چار>obj؛
objایک پر = 12۔؛
objفنکشن('$'،'500')؛

واپسی ؛
}

نام چھپانا۔

نام چھپانے کی ایک مثال اس وقت ہوتی ہے جب ایک ہی آبجیکٹ کی قسم کے نام کو نیسٹڈ بلاک میں دوبارہ اعلان کیا جاتا ہے۔ مندرجہ ذیل پروگرام اس کی وضاحت کرتا ہے:

#شامل کریں
استعمال کرتے ہوئے نام کی جگہگھنٹے؛

باطلfn()
{
intکہاں= ؛
اگر (==)
{
intکہاں= ؛
لاگت<<کہاں<<'n'؛
}
لاگت<<کہاں<<'n'؛
}

intمرکزی()
{
fn()؛
واپسی ؛
}

پیداوار یہ ہے:

اس کی وجہ یہ ہے کہ نیسٹڈ بلاک میں var بیرونی بلاک میں var چھپا ہوا ہے۔

اسی دائرہ کار میں اعادہ دہرانے کا امکان۔

اعلان کا نقطہ یہ ہے کہ جہاں نام اس کے دائرہ کار میں (پہلی بار) متعارف کرایا گیا ہے۔

فنکشن پروٹوٹائپ
مختلف ادارے ، یہاں تک کہ مختلف اقسام کے ، عام طور پر ایک ہی دائرہ کار میں قرار نہیں دیا جا سکتا۔ تاہم ، ایک فنکشن پروٹوٹائپ کو ایک ہی دائرہ کار میں ایک سے زیادہ مرتبہ قرار دیا جا سکتا ہے۔ دو فنکشن پروٹوٹائپ اور متعلقہ فنکشن کی تعریف کے ساتھ مندرجہ ذیل پروگرام اس کی وضاحت کرتا ہے:

#شامل کریں
استعمال کرتے ہوئے نام کی جگہگھنٹے؛

باطلfn(intایک پر)؛
باطلfn(intایک پر)؛

باطلfn(intایک پر)
{
لاگت<<ایک پر<<'n'؛
}

intمرکزی()
{
fn()؛

واپسی ؛
}

پروگرام کام کرتا ہے۔

اوورلوڈ افعال۔
اوورلوڈ افعال ایک ہی نام کے افعال ہیں لیکن مختلف فنکشن دستخط ہیں۔ ایک اور استثنا کے طور پر ، ایک ہی نام کے ساتھ اوورلوڈ افعال کو اسی دائرہ کار میں بیان کیا جا سکتا ہے۔ مندرجہ ذیل پروگرام اس کی وضاحت کرتا ہے:

#شامل کریں
استعمال کرتے ہوئے نام کی جگہگھنٹے؛

باطلfn(intایک پر)
{
لاگت<<ایک پر<<'n'؛
}

باطلfn(تیرنانہیں)
{
لاگت<<نہیں<<'n'؛
}

intمرکزی()
{
fn()؛
تیرناflt= 8.7۔؛
fn(flt)؛

واپسی ؛
}

پیداوار یہ ہے:

8.7۔

اوورلوڈ افعال کی وضاحت عالمی دائرہ کار میں کی گئی ہے۔

نام کی گنجائش

نام کی جگہ کا دائرہ اس کے اپنے مضمون کا مستحق ہے۔ مذکورہ مضمون اس ویب سائٹ linuxhint.com کے لیے لکھا گیا ہے۔ صرف اس سائٹ (صفحہ) کے سرچ باکس میں سرچ اسپیس ورڈ ٹائپ کریں اور ٹھیک پر کلک کریں ، اور آپ کو مضمون مل جائے گا۔

دائرہ کار مختلف حصوں میں۔

کلاس واحد اسکیم نہیں ہے جہاں دائرہ کار مختلف حصوں میں ہو۔ دوست کی وضاحت کرنے والے ، تفصیلی قسم کے مخصوص استعمال کرنے والے کے کچھ استعمالات ، اور استعمال کرنے کی ہدایات دوسری اسکیمیں ہیں جہاں دائرہ کار مختلف جگہوں پر ہے-تفصیلات کے لیے ، بعد میں دیکھیں۔

نتیجہ

دائرہ کار ایک اعلانیہ علاقہ ہے۔ ایک اعلانیہ علاقہ پروگرام کے متن کا سب سے بڑا حصہ ہے جس میں کسی ہستی کا نام درست ہوتا ہے۔ اسے مخصوص پروگرامنگ سکیموں کے مطابق ایک سے زیادہ حصوں میں تقسیم کیا جا سکتا ہے ، جیسے نیسٹڈ بلاکس۔ جن حصوں میں ڈیکلریشن پوائنٹ نہیں ہے وہ ممکنہ دائرہ کار بناتے ہیں۔ ممکنہ دائرہ کار میں اعلان ہو سکتا ہے یا نہیں۔