C++ میں جامد عالمی متغیرات

C My Jamd Almy Mtghyrat



C++ پروگرامنگ لینگویج میں متغیرات ڈیٹا کو ہینڈل اور مینیج کرنے کے لیے بنیادی تعمیراتی بلاکس کے طور پر کام کرتے ہیں جو کہ C++ پروگرام کے اندر متغیرات کو جوڑنے میں اہم کردار ادا کرتے ہیں۔ C++ پروگرامنگ لینگویج جامد عالمی متغیرات کا استعمال کرتے ہوئے مختلف دائروں اور تالیف یونٹس میں متغیر کی نمائش کو منظم کرنے کا ایک مضبوط طریقہ پیش کرتی ہے۔ ایک جامد عالمی متغیر جس کا اعلان عالمی دائرہ کار میں کیا جاتا ہے اس فائل تک محدود ہے جس میں اس کی تعریف 'static' specifier کی وجہ سے کی گئی ہے۔ 'سٹیٹک' کلیدی لفظ اس بات کو یقینی بناتا ہے کہ متغیر اس فائل کے اندر موجود فنکشن کالز میں اپنی قدر کو برقرار رکھتا ہے لیکن دوسری فائلوں کے لیے ناقابل رسائی اور پوشیدہ رہتا ہے۔ C++ میں جامد عالمی متغیر پروگرام کی حالت کو منظم کرنے میں اہم ہیں۔ یہ مضمون جامد عالمی متغیرات کی پیچیدگیوں کو تلاش کرتا ہے، ان کی خصوصیات، استعمال کے معاملات اور ممکنہ چیلنجوں کو اجاگر کرتا ہے۔

C++ میں جامد متغیرات

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







C++ میں جامد متغیرات کے اطلاقات

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



منظر نامہ 1: متعدد افعال میں کاؤنٹر

جب ایک متغیر کا اعلان کسی فنکشن کے اندر جامد کلیدی لفظ کے ساتھ کیا جاتا ہے، تو یہ ایک ہی فنکشن کی متعدد کالوں میں اپنی حالت کو محفوظ رکھتا ہے۔ متغیر کی حالت کو برقرار رکھنے کی یہ صلاحیت مخصوص حالات میں فائدہ مند ہو سکتی ہے۔ آئیے ایک C++ جامد عالمی متغیر کا استعمال کرتے ہوئے متعدد فنکشنز میں کاؤنٹر کو سمجھنے کے لیے ایک مثال دیکھیں۔ مثال کے طور پر کوڈ دیا گیا ہے:



# شامل کریں
کلاس کاؤنٹر {
نجی:
جامد انٹ گلوبل کاؤنٹر؛
عوام:
باطل انکریمنٹ کاؤنٹر ( ) {
++عالمی کاؤنٹر؛
}
int getCounterValue ( ) const {
واپسی گلوبل کاؤنٹر
}
} ;
int Counter ::globalCounter = 0 ;
اہم int ( ) {
کاؤنٹر کاؤنٹر؛
کے لیے ( int i = 0 ; میں < 5 ; ++i ) {
counter.incrementCounter ( ) ;
}
int counterValue = counter.getCounterValue ( ) ;
std::cout << 'کاؤنٹر کی قیمت ہے:' << جوابی قدر << std::endl;
واپسی 0 ;
}





یہ کوڈ دو فنکشنز کے ساتھ ایک سادہ 'کاؤنٹر' کلاس کی وضاحت کرتا ہے: 'انکریمنٹ کاؤنٹر' جو عالمی کاؤنٹر کو 1 تک بڑھاتا ہے اور 'گیٹ کاؤنٹر ویلیو' جو عالمی کاؤنٹر کی موجودہ قیمت واپس کرتا ہے۔ کوڈ میں ایک مرکزی فنکشن بھی شامل ہے جو یہ بتاتا ہے کہ 'کاؤنٹر' کلاس کو کیسے استعمال کیا جائے۔ یہ ایک 'کاؤنٹر' آبجیکٹ بناتا ہے، کاؤنٹر کو پانچ گنا بڑھاتا ہے، اس کی قیمت بازیافت کرتا ہے، اور اسے کنسول پر پرنٹ کرتا ہے۔ یہ نفاذ ایک واحد عالمی کاؤنٹر کا استعمال کرتا ہے جس کا اشتراک تمام 'کاؤنٹر' اشیاء کے ذریعے کیا جاتا ہے۔ یہ آسان اور سمجھنے میں آسان ہے، لیکن یہ ان حالات کے لیے موزوں نہیں ہو سکتا جہاں آپ کو متعدد آزاد کاؤنٹرز کی ضرورت ہو۔ پروگرام کی درج ذیل آؤٹ پٹ دیکھیں:



اس مثال میں، آپ مشاہدہ کر سکتے ہیں کہ 'globalCounter' جامد متغیر 'incrementCounter' اور 'getCounterValue' جیسے فنکشنز کی کالز کے درمیان اپنی حالت کو برقرار رکھتا ہے جو ایک ہی فائل میں متعدد فنکشنز میں ایک مستقل کاؤنٹر کے طور پر کام کرتا ہے۔

منظر نامہ 2: یوٹیلیٹی فنکشن تمام مثالوں میں مشترکہ

جب کلاس میں ممبر فنکشن کو جامد کے طور پر بیان کیا جاتا ہے، تو یہ کلاس کے تمام واقعات کے لیے دستیاب ہو جاتا ہے۔ تاہم، یہ کسی مثال کے رکن تک رسائی حاصل نہیں کر سکتا کیونکہ اس کے پاس پوائنٹر نہیں ہے۔ آئیے اس منظر نامے کو بہتر طور پر سمجھنے کے لیے درج ذیل متعلقہ مثال پر غور کریں:

# شامل کریں
یوٹیلیٹی کلاس {
عوام:
جامد باطل افادیت فنکشن ( ) {
std::cout << 'یوٹیلٹی فنکشن کہا جاتا ہے۔' << std::endl;
}
} ;
کلاس MyClass {
عوام:
باطل کال یوٹیلیٹی فنکشن ( ) {
یوٹیلیٹی کلاس :: یوٹیلیٹی فنکشن ( ) ;
}
} ;
اہم int ( ) {
مائی کلاس آبجیکٹ؛
obj.callUtilityFunction ( ) ;
واپسی 0 ;
}

یہ کوڈ دو کلاسوں کی وضاحت کرتا ہے: 'UtilityClass' اور 'MyClass'۔ 'UtilityClass' میں ایک عوامی جامد فنکشن ہے جسے 'utilityFunction' کہا جاتا ہے جو کنسول پر 'Utility function is called' پرنٹ کرتا ہے۔ 'MyClass' میں 'callUtilityFunction' نامی ایک عوامی فنکشن ہے جو 'UtilityClass' کے 'utilityFunction' کو کہتے ہیں۔

مین فنکشن 'MyClass' کا ایک آبجیکٹ بناتا ہے جسے 'obj' کہتے ہیں۔ اس کے بعد یہ 'obj' آبجیکٹ کے 'callUtilityFunction' فنکشن کو کال کرتا ہے۔ اس کی وجہ سے 'UtilityClass' کے 'utilityFunction' فنکشن کو بلایا جاتا ہے جو کنسول پر 'Utility function is called' پرنٹ کرتا ہے۔ کوڈ کی درج ذیل آؤٹ پٹ دیکھیں:

یہ نقطہ نظر الگ الگ اشیاء کی ضرورت کو ختم کرتا ہے اور کوڈ کی ساخت کو آسان بناتا ہے۔ کلاس 'یوٹیلٹی فنکشن' تک رسائی کے دو طریقے فراہم کرتی ہے۔ ایک طریقہ براہ راست ہے جو UtilityClass::utilityFunction() نحو کا استعمال کر رہا ہے جو کسی چیز کو بنائے بغیر قابل رسائی ہے۔ دوسرا طریقہ ایک ایسی چیز کے ذریعے ہے جو obj.callUtilityFunction() ممبر فنکشن کا استعمال کرتا ہے جو کلاس کے اندر مزید سیاق و سباق اور ممکنہ اضافی فعالیت کی اجازت دیتا ہے۔ یہ نقطہ نظر سادگی اور لچک کو متوازن رکھتا ہے، یہ یوٹیلیٹی فنکشن کے لیے آپ کے مطلوبہ استعمال کے انداز پر منحصر ہے۔

منظر نامہ 3: جامد عالمی متغیر میں کلاس اسکوپ

کلاس کی مثالوں کی تعداد سے قطع نظر، ایک رکن جسے کلاس میں جامد قرار دیا جاتا ہے صرف ایک کاپی میں موجود ہوتا ہے۔ یہ ڈیٹا ممبرز (متغیرات) اور ممبر کے افعال دونوں پر لاگو ہوتا ہے۔ اہم بات یہ ہے کہ جامد ڈیٹا ممبر کی تعریف کلاس ڈیکلریشن سے باہر ہونی چاہیے، عام طور پر فائل کے دائرہ کار میں۔

یہاں جامد کی ایک مثال ہے جو C++ میں ڈیٹا ممبر اور ممبر فنکشن دونوں پر لاگو ہوتی ہے۔

# شامل کریں
کلاس کاؤنٹر {
عوام:
جامد int گلوبل شمار؛
کاؤنٹر ( ) {
++عالمی شمار؛
}
جامد باطل پرنٹ گلوبل کاؤنٹ ( ) {
std::cout << 'عالمی شمار یہ ہے:' << عالمی شمار << std::endl;
}
} ;
int Counter ::globalCount = 0 ;
اہم int ( ) {
کاؤنٹر کاؤنٹر 1;
کاؤنٹر کاؤنٹر2;
کاؤنٹر::printGlobalCount ( ) ;
واپسی 0 ;
}

کوڈ ایک کلاس کی وضاحت کرتا ہے جسے 'کاؤنٹر' کہا جاتا ہے جس میں ایک پرائیویٹ سٹیٹک ممبر ویری ایبل ہے جس کا نام 'globalCount' اور دو پبلک ممبر فنکشنز ہیں۔ ایک Counter() ہے جو ایک کنسٹرکٹر فنکشن ہے جو 'globalCount' متغیر کو بڑھاتا ہے۔ دوسرا ایک 'printGlobalCount' ہے جو 'globalCount' متغیر کی موجودہ قدر واپس کرتا ہے۔ کوڈ میں ایک اہم فنکشن بھی شامل ہے۔ یہ فنکشن 'کاؤنٹر' کلاس کے دو آبجیکٹ بناتا ہے جن کی شناخت 'کاؤنٹر 1' اور 'کاؤنٹر2' ناموں سے ہوتی ہے۔ متغیر کے اعلان کے بعد، یہ 'Counter::printGlobalCount' فنکشن کو کال کرتا ہے جو ممکنہ طور پر 'globalCount' متغیر کی موجودہ قدر پرنٹ کرتا ہے۔ مندرجہ ذیل آؤٹ پٹ کا ٹکڑا دیکھیں:

اس مثال میں، ایک 'globalCount' متغیر کو 'کاؤنٹر' کلاس کے اندر ایک جامد ڈیٹا ممبر کے طور پر قرار دیا گیا ہے۔ اس کا مطلب ہے کہ اس متغیر کی صرف ایک کاپی موجود ہے، قطع نظر اس کے کہ کتنے ہی 'کاؤنٹر' آبجیکٹ بنائے گئے ہوں۔ کاؤنٹر()کنسٹرکٹر ہر ایک مثال کے لیے 'گلوبل کاؤنٹ' کو بڑھاتا ہے، جس سے تمام اشیاء میں اس کی مشترکہ نوعیت کا مظاہرہ ہوتا ہے۔ 'printGlobalCount' ایک جامد ممبر فنکشن ہے۔ یاد رکھیں، یہ براہ راست کلاس کے نام کا استعمال کرتے ہوئے کیا جاتا ہے (Counter::printGlobalCount)۔ آؤٹ پٹ سے پتہ چلتا ہے کہ 'عالمی شمار' میں توقع کے مطابق اضافہ ہوا ہے، جو 'کاؤنٹر' کلاس کی تمام مثالوں میں مشترکہ حالت کی عکاسی کرتا ہے۔

نتیجہ

آخر میں، C++ میں جامد عالمی متغیرات ریاست کو فنکشنز اور فائلوں میں منظم کرنے کے لیے ایک ورسٹائل ٹول کے طور پر ابھرتے ہیں۔ ان کا اندرونی تعلق، مستقل نوعیت، اور کنٹرول شدہ معلومات کا اشتراک انہیں پروگرامنگ کے مخصوص منظرناموں میں قیمتی اثاثہ بناتا ہے۔ ان کی خصوصیات کو سمجھ کر، استعمال کے متنوع کیسوں کو تلاش کرکے، اور ممکنہ نقصانات کو تسلیم کرتے ہوئے، ڈویلپرز مستحکم عالمی متغیرات کو مؤثر طریقے سے چلا سکتے ہیں، کوڈ کی ماڈیولریٹی کو بڑھا کر اور اپنے پروجیکٹس کے مختلف حصوں کے درمیان رابطے میں سہولت فراہم کر سکتے ہیں۔ سوچ سمجھ کر اور بہترین طریقوں پر عمل کرنے کے ذریعے، جامد عالمی متغیرات کو C++ پروگراموں کے ڈیزائن اور فعالیت میں مثبت کردار ادا کرنے کے لیے استعمال کیا جا سکتا ہے۔