C ++ এ সুযোগ

Scope C



C ++ এর একটি সত্তার একটি নাম আছে, যা ঘোষিত এবং/অথবা সংজ্ঞায়িত করা যেতে পারে। একটি ঘোষণা একটি সংজ্ঞা, কিন্তু একটি সংজ্ঞা অগত্যা একটি ঘোষণা নয়। একটি সংজ্ঞা নামযুক্ত সত্তার জন্য মেমরি বরাদ্দ করে, কিন্তু একটি ঘোষণা নামক সত্তার জন্য মেমরি বরাদ্দ করতে পারে বা নাও করতে পারে। একটি ঘোষণামূলক অঞ্চল একটি প্রোগ্রামের বৃহত্তম অংশ যেখানে একটি সত্তা (পরিবর্তনশীল) এর নাম বৈধ। সেই অঞ্চলকে একটি সুযোগ বা সম্ভাব্য সুযোগ বলা হয়। এই নিবন্ধটি C ++ এ স্কোপিং ব্যাখ্যা করে। উপরন্তু, এই নিবন্ধটি বোঝার জন্য C ++ এ মৌলিক জ্ঞান প্রয়োজন।

নিবন্ধ বিষয়বস্তু

ঘোষণামূলক অঞ্চল এবং সুযোগ

একটি ঘোষণামূলক অঞ্চল একটি প্রোগ্রাম পাঠ্যের বৃহত্তম অংশ যেখানে একটি সত্তার নাম বৈধ। এটি সেই অঞ্চল যেখানে অযোগ্য নাম ব্যবহার করা যেতে পারে (দেখা) একই সত্তাকে বোঝাতে। নিম্নলিখিত সংক্ষিপ্ত প্রোগ্রাম বিবেচনা করুন:







#অন্তর্ভুক্ত
ব্যবহার নামস্থানঘন্টার;

অকার্যকরfn()
{
intকোথায়= 3;
যদি (==)
{
খরচ<<কোথায়<<'n';
}
}

intপ্রধান()
{
fn();
প্রত্যাবর্তন 0;
}

ফাংশন fn () এর দুটি ব্লক রয়েছে: if-condition এর জন্য একটি ভিতরের ব্লক এবং ফাংশন বডির জন্য একটি বাইরের ব্লক। শনাক্তকারী, var, প্রবর্তিত এবং বাইরের ব্লকে দেখা যায়। এটি অভ্যন্তরীণ ব্লকেও দেখা যায়, cout স্টেটমেন্ট সহ। বাহ্যিক এবং অভ্যন্তরীণ ব্লক উভয় নামের জন্য সুযোগ, var।



যাইহোক, নাম, var, এখনও একটি ভিন্ন সত্তা ঘোষণা করতে ব্যবহার করা যেতে পারে যেমন ভিতরের ব্লকে একটি ভাসা। নিচের কোডটি এটিকে ব্যাখ্যা করে:



#অন্তর্ভুক্ত
ব্যবহার নামস্থানঘন্টার;

অকার্যকরfn()
{
intকোথায়= 3;
যদি (==)
{
ভাসাকোথায়= 7.5;
খরচ<<কোথায়<<'n';
}
}

intপ্রধান()
{
fn();
প্রত্যাবর্তন 0;
}

আউটপুট 7.5। এই ক্ষেত্রে, নাম, var, আর ভিতরের ব্লকে ব্যবহার করা যাবে না মান 3 এর পূর্ণসংখ্যা বোঝাতে, যা বাইরের ব্লকে চালু (ঘোষিত) ছিল। এই ধরনের অভ্যন্তরীণ ব্লকগুলিকে বাইরের ব্লকে ঘোষিত সত্তার সম্ভাব্য সুযোগ হিসাবে উল্লেখ করা হয়।





দ্রষ্টব্য: বাইরের ব্লকের মতো একই ধরণের একটি সত্তা, এখনও অভ্যন্তরীণ ব্লকে ঘোষণা করা যেতে পারে। যাইহোক, এই ক্ষেত্রে, অভ্যন্তরীণ ব্লকে যা বৈধ তা হল নতুন ঘোষণাপত্র এবং এর অর্থ, যখন পুরাতন ঘোষণা এবং এর অর্থ অভ্যন্তরীণ ব্লকের বাইরের ব্লকে বৈধ থাকে।

একটি অভ্যন্তরীণ ব্লকে একই নামের ঘোষণা সাধারণত সেই অভ্যন্তরীণ ব্লকের বাইরে একই নামের ঘোষণাকে ওভাররাইড করে। অভ্যন্তরীণ ব্লকগুলি অন্যান্য অভ্যন্তরীণ ব্লকে বাসা বাঁধতে পারে।



বৈশ্বিক ব্যাপ্তি

যখন একজন প্রোগ্রামার কেবল একটি ফাইল টাইপ করা শুরু করেন, তখন এটি বিশ্বব্যাপী সুযোগ। নিম্নলিখিত সংক্ষিপ্ত কর্মসূচী এটি ব্যাখ্যা করে:

#অন্তর্ভুক্ত
ব্যবহার নামস্থানঘন্টার;

ভাসাকোথায়= 9.4;

intপ্রধান()
{
খরচ <<কোথায়<<'n';
খরচ <<::কোথায়<<'n';

প্রত্যাবর্তন 0;
}

আউটপুট হল:
9.4
9.4

এই ক্ষেত্রে, ঘোষণামূলক অঞ্চল বা var এর সুযোগ var এর ঘোষণার বিন্দু থেকে শুরু হয়, ফাইলের শেষ পর্যন্ত (অনুবাদ ইউনিট) নিচের দিকে অব্যাহত থাকে।

প্রধান () ফাংশনের ব্লক একটি ভিন্ন সুযোগ; এটি বিশ্বব্যাপী সুযোগের জন্য একটি নেস্টেড সুযোগ। গ্লোবাল স্কোপের একটি সত্তা অ্যাক্সেস করার জন্য, একটি ভিন্ন সুযোগ থেকে, আইডেন্টিফায়ারটি সরাসরি বা তার আগে স্কোপ রেজোলিউশন অপারেটর, :: ব্যবহার করা হয়।

দ্রষ্টব্য: সত্তা, প্রধান (), বৈশ্বিক পরিসরেও ঘোষণা করা হয়েছে।

ব্লক স্কোপ

If, while, do, for, or switch statement প্রত্যেকটি একটি ব্লককে সংজ্ঞায়িত করতে পারে। এই ধরনের বিবৃতি একটি যৌগিক বিবৃতি। একটি ব্লকে ঘোষিত একটি ভেরিয়েবলের নাম একটি ব্লকের সুযোগ রয়েছে। এর পরিধি ঘোষণার সময়ে শুরু হয় এবং তার ব্লকের শেষে শেষ হয়। নিম্নলিখিত সংক্ষিপ্ত প্রোগ্রামটি পরিবর্তনশীল, আইডেন্টিটির জন্য এটি ব্যাখ্যা করে:

#অন্তর্ভুক্ত
ব্যবহার নামস্থানঘন্টার;

intপ্রধান()
{
যদি (==)
{
/*কিছু বিবৃতি*/
intপরিচয়= 5;
খরচ<<পরিচয়<<'n';
/*কিছু বিবৃতি*/
}
প্রত্যাবর্তন 0;
}

একটি পরিবর্তনশীল, যেমন আইডেন, ব্লক স্কোপে ঘোষণা করা হয় একটি স্থানীয় পরিবর্তনশীল।

ব্লকের সুযোগের বাইরে ঘোষিত একটি ভেরিয়েবল ব্লকের হেডারে (যেমন, if-block এর শর্ত) এবং ব্লকের মধ্যেও দেখা যায়। নিম্নলিখিত সংক্ষিপ্ত প্রোগ্রামটি ভেরিয়েবল, শনাক্তকরণের জন্য এটি ব্যাখ্যা করে:

#অন্তর্ভুক্ত
ব্যবহার নামস্থানঘন্টার;

intপ্রধান()
{
intশনাক্তকারী= 8;

যদি (শনাক্তকারী== 8)
{
খরচ<<শনাক্তকারী<<'n';
}
প্রত্যাবর্তন 0;
}

আউটপুট হল 8. এখানে দুটি ব্লক স্কোপ রয়েছে: প্রধান () ফাংশনের জন্য ব্লক এবং নেস্টেড যদি যৌগিক বিবৃতি। নেস্টেড ব্লক হল প্রধান () ফাংশন ব্লকের সম্ভাব্য সুযোগ।

একটি ব্লক স্কোপে প্রবর্তিত একটি ঘোষণা ব্লকের বাইরে দেখা যাবে না। নিম্নলিখিত সংক্ষিপ্ত প্রোগ্রাম, যা সংকলন করে না, এটি পরিবর্তনশীল, variab দিয়ে ব্যাখ্যা করে:

#অন্তর্ভুক্ত
ব্যবহার নামস্থানঘন্টার;

intপ্রধান()
{
যদি ( == )
{
intvariab= পনের;
}
খরচ<<variab<<'n'; // ত্রুটি: এর আওতার বাইরে অ্যাক্সেস করা হয়েছে।

প্রত্যাবর্তন 0;
}

কম্পাইলার variab এর জন্য একটি ত্রুটি বার্তা তৈরি করে।

যৌগিক ফাংশনের শিরোনামে ঘোষিত একটি সত্তা, যৌগিক বিবৃতির বাইরে (নীচে) দেখা যাবে না। নিম্নলিখিত ফর-লুপ কোড কম্পাইল হবে না, যার ফলে একটি ত্রুটি বার্তা হবে:

#অন্তর্ভুক্ত
ব্যবহার নামস্থানঘন্টার;

intপ্রধান()
{
জন্য (intআমি=0;আমি<4; ++আমি)
{
খরচ<<আমি<<'';
}
খরচ<<আমি<<'';

প্রত্যাবর্তন 0;
}

পুনরাবৃত্তি পরিবর্তনশীল, i, ফর-লুপ ব্লকের ভিতরে দেখা যায় কিন্তু ফর-লুপ ব্লকের বাইরে নয়।

ফাংশন ব্যাপ্তি

ফাংশন ব্লকে একটি ফাংশন প্যারামিটার দেখা যায়। ফাংশন ব্লকে ঘোষিত একটি সত্তাকে ঘোষণার বিন্দু থেকে ফাংশন ব্লকের শেষ পর্যন্ত দেখা যায়। নিম্নলিখিত সংক্ষিপ্ত কর্মসূচী এটি ব্যাখ্যা করে:

#অন্তর্ভুক্ত
#অন্তর্ভুক্ত
ব্যবহার নামস্থানঘন্টার;

স্ট্রিং fn(স্ট্রিং str)
{
গৃহস্থালিstri[] = 'কলা';
/*অন্যান্য বিবৃতি*/
স্ট্রিং totalStr=পৃ+stri;
প্রত্যাবর্তনমোট স্ট্র;
}

intপ্রধান()
{
স্ট্রিং totStr=fn('খাওয়া');
খরচ<<totStr<<'n';

প্রত্যাবর্তন 0;
}

আউটপুট হল:
কলা খাওয়া

দ্রষ্টব্য: ফাংশনের বাইরে ঘোষিত একটি সত্তা (এর উপরে) ফাংশন প্যারামিটার তালিকায় এবং ফাংশন ব্লকেও দেখা যায়।

লেবেল

একটি লেবেলের সুযোগ হল ফাংশন যেখানে এটি প্রদর্শিত হয়। নিচের কোডটি এটিকে ব্যাখ্যা করে:

#অন্তর্ভুক্ত
ব্যবহার নামস্থানঘন্টার;

অকার্যকরfn()
{
যাওlabl;
/*অন্যান্য বিবৃতি*/
labl: intনা= 2;
খরচ<<না<<'n';
}

intপ্রধান()
{
fn();

প্রত্যাবর্তন 0;
}

আউটপুট 2।

গণনার সুযোগ

অপ্রকাশিত গণনা
নিচের আইফ-ব্লকটি বিবেচনা করুন:

যদি (==)
{
enum {a, b, c=+2};
খরচ<<প্রতি<<''<<<<''<<<<'n';
}

আউটপুট 0 1 3।

ব্লকের প্রথম লাইন হল একটি গণনা, a, b এবং c হল এর গণক। একটি গণকের সুযোগ ঘোষণার বিন্দু থেকে শুরু করে গণনার পরিবেষ্টন ব্লকের শেষ পর্যন্ত।

নিম্নলিখিত বিবৃতি সংকলন করা হবে না কারণ c এর ঘোষণার বিন্দু a এর পরে:

enum {প্রতি=+2, খ, গ};

নিম্নলিখিত কোড সেগমেন্ট কম্পাইল করা হবে না কারণ গণনাকারীরা ব্লক করার পরে অ্যাক্সেস করে:

যদি (==)
{
enum {a, b, c=+2};
}
খরচ<<প্রতি<<''<<<<''<<<<'n'; // ত্রুটি: সুযোগের বাইরে

উপরোক্ত গণনাটি একটি অপ্রকাশিত গণনা হিসাবে বর্ণনা করা হয়েছে, এবং এর গণকগুলিকে অপ্রকাশিত গণক হিসাবে বর্ণনা করা হয়েছে। কারণ এটি শুধুমাত্র সংরক্ষিত শব্দ, enum দিয়ে শুরু হয়। এনুম ক্লাস বা এনাম স্ট্রাক্ট দিয়ে শুরু হওয়া গণনাগুলিকে স্কোপ করা গণনা হিসাবে বর্ণনা করা হয়। তাদের গণনাকারীদের বিস্তৃত গণক হিসাবে বর্ণনা করা হয়েছে।

বিস্তৃত গণনা
নিম্নলিখিত বিবৃতি ঠিক আছে:

enum শ্রেণীপুরুষ{a, b, c=+2};

এটি একটি বিস্তৃত গণনার একটি উদাহরণ। ক্লাসের নাম নাম। এখানে, গণনার ব্যাপ্তি ঘোষণার বিন্দু থেকে শুরু করে গণনার সংজ্ঞার শেষ পর্যন্ত, এবং গণনার জন্য ঘেরের ব্লকের শেষ নয়। নিম্নলিখিত কোড কম্পাইল করা হবে না:

যদি (==)
{
enum শ্রেণীপুরুষ{a, b, c=+2};
খরচ<<প্রতি<<''<<<<''<<<<'n'; // ত্রুটি: enum ক্লাস বা enum struct এর সুযোগের বাইরে
}

ক্লাসের পরিধি

স্বাভাবিক পরিসরের সাথে, ঘোষণামূলক অঞ্চল একটি বিন্দু থেকে শুরু হয়, তারপর চলতে থাকে এবং একটি ভিন্ন বিন্দুতে থামে। সুযোগ একটি অবিচ্ছিন্ন অঞ্চলে বিদ্যমান। ক্লাসের সাথে, একটি সত্তার সুযোগ বিভিন্ন অঞ্চলে হতে পারে যা একসাথে যুক্ত হয় না। নেস্টেড ব্লকের নিয়ম এখনও প্রযোজ্য। নিম্নলিখিত প্রোগ্রামটি এটিকে ব্যাখ্যা করে:

#অন্তর্ভুক্ত
ব্যবহার নামস্থানঘন্টার;

// বেস ক্লাস
শ্রেণীক্লা
{
ব্যক্তিগত:
intmemP= 5;
সুরক্ষিত:
intmemPro= 9;
জনসাধারণ:
অকার্যকরfn()
{
খরচ<<memP<<'n';
}
};

// প্রাপ্ত ক্লাস
শ্রেণীডেরক্লা: জনসাধারণক্লা
{
জনসাধারণ:
intderMem=memPro;
};
intপ্রধান()
{
Cla obj;
objfn();
DerCla derObj;
খরচ<<derObj।derMem<<'n';

প্রত্যাবর্তন 0;
}

আউটপুট হল:
5
9

ক্লাস Cla এ, পরিবর্তনশীল memP, ঘোষণার সময়ে দেখা যায়। এর পরে, সুরক্ষিত ছোট অংশ বাদ দেওয়া হয়, তারপর আবার ক্লাস মেম্বার ফাংশন ব্লকে দেখা যায়। প্রাপ্ত শ্রেণীটি বাদ দেওয়া হয়, তারপর আবার প্রধান () ফাংশন স্কোপ (ব্লক) এ দেখা যায়।

ক্লাস ক্লাসে, পরিবর্তনশীল memPro, ঘোষণার সময়ে দেখা যায়। পাবলিক ফাংশন fn () এর অংশটি বাদ দেওয়া হয়, তারপর ডেরিভেটেড ক্লাস ডেসক্রিপশন ব্লকে দেখা যায়। এটি আবার প্রধান () ফাংশনে দেখা যায়।

স্কোপ রেজোলিউশন অপারেটর
C ++ এ স্কোপ রেজোলিউশন অপারেটর হল ::। এটি ক্লাসের একটি স্ট্যাটিক সদস্য অ্যাক্সেস করতে ব্যবহৃত হয়। নিম্নলিখিত প্রোগ্রামটি এটিকে ব্যাখ্যা করে:

#অন্তর্ভুক্ত
ব্যবহার নামস্থানঘন্টার;

শ্রেণীক্লা
{
জনসাধারণ:
স্থির int constমেম= 5;
জনসাধারণ:
স্থির অকার্যকরfn()
{
খরচ<<মেম<<'n';
}
};
intপ্রধান()
{
খরচ<<ক্লা::মেম<<'n';
ক্লা::fn();

প্রত্যাবর্তন 0;
}

আউটপুট হল:
5
5

স্ট্যাটিক সদস্যদের প্রধান () ফাংশন ব্লকে দেখা যায়, স্কোপ রেজোলিউশন অপারেটর ব্যবহার করে অ্যাক্সেস করা হয়।

টেমপ্লেট প্যারামিটার স্কোপ

একটি টেমপ্লেট প্যারামিটার নামের স্বাভাবিক সুযোগ ঘোষণার বিন্দু থেকে তার ব্লকের শেষ পর্যন্ত শুরু হয়, যেমন নিম্নোক্ত কোড:

টেমপ্লেট<টাইপ নামটি,টাইপ নাম> কাঠামোবয়স
{
টি জন= এগারো;
তুমি পিটার= 12.3;
টি মেরি= 13;
ইউ জয়= 14.6;
};

U এবং T ব্লকের মধ্যে দেখা যায়।

একটি টেমপ্লেট ফাংশন প্রোটোটাইপের জন্য, ঘোষণার বিন্দু থেকে ফাংশন প্যারামিটার তালিকার শেষ পর্যন্ত সুযোগ শুরু হয়, যেমন নিম্নলিখিত বিবৃতিতে:

টেমপ্লেট<টাইপ নামটি,টাইপ নাম> অকার্যকরফাংশন(তুমি না, তুমি চা,const গৃহস্থালি *পৃ);

যাইহোক, যখন ক্লাসের বিবরণ (সংজ্ঞা) এর কথা আসে, সুযোগটি নিম্নলিখিত কোডের মতো বিভিন্ন অংশেও হতে পারে:

#অন্তর্ভুক্ত
ব্যবহার নামস্থানঘন্টার;

টেমপ্লেট<শ্রেণীটি,শ্রেণী> শ্রেণীTheCla
{
জনসাধারণ:
টি সংখ্যা;
স্থিরউ চ;

অকার্যকরফাংশন(তুমি বাবা,const গৃহস্থালি *পৃ)
{
খরচ << 'সেখানে ' <<একের উপর<< 'মূল্যবান বই' <<না<<পৃ<< ' দোকান.' << 'n';
}
স্থির অকার্যকরমজা(উ চ)
{
যদি (সিএইচ== 'প্রতি')
খরচ << 'অফিসিয়াল স্ট্যাটিক সদস্য ফাংশন' << 'n';
}
};

intপ্রধান()
{
TheCla<int,গৃহস্থালি>obj;
objএকের উপর = 12;
objফাংশন('$','500');

প্রত্যাবর্তন 0;
}

নাম লুকানো

নাম লুকানোর একটি উদাহরণ ঘটে যখন একই বস্তুর নাম নেস্টেড ব্লকে পুনরায় ঘোষণা করা হয়। নিম্নলিখিত প্রোগ্রামটি এটিকে ব্যাখ্যা করে:

#অন্তর্ভুক্ত
ব্যবহার নামস্থানঘন্টার;

অকার্যকরfn()
{
intকোথায়= 3;
যদি (==)
{
intকোথায়= 4;
খরচ<<কোথায়<<'n';
}
খরচ<<কোথায়<<'n';
}

intপ্রধান()
{
fn();
প্রত্যাবর্তন 0;
}

আউটপুট হল:
4
3

কারণ, নেস্টেড ব্লকের var বাইরের ব্লকে var লুকিয়ে রেখেছে।

একই পরিসরে ঘোষণাপত্র পুনরাবৃত্তি করার সম্ভাবনা

ঘোষণার মূল বিষয় হল যেখানে নামটি তার পরিসরে (প্রথমবারের জন্য) চালু করা হয়েছে।

ফাংশন প্রোটোটাইপ
বিভিন্ন সত্তা, এমনকি বিভিন্ন ধরণের, সাধারণত একই পরিসরে ঘোষণা করা যায় না। যাইহোক, একটি ফাংশন প্রোটোটাইপ একই সুযোগে একাধিকবার ঘোষণা করা যেতে পারে। দুটি ফাংশন প্রোটোটাইপ এবং সংশ্লিষ্ট ফাংশন সংজ্ঞা সহ নিম্নলিখিত প্রোগ্রামটি এটি ব্যাখ্যা করে:

#অন্তর্ভুক্ত
ব্যবহার নামস্থানঘন্টার;

অকার্যকরfn(intএকের উপর);
অকার্যকরfn(intএকের উপর);

অকার্যকরfn(intএকের উপর)
{
খরচ<<একের উপর<<'n';
}

intপ্রধান()
{
fn(5);

প্রত্যাবর্তন 0;
}

প্রোগ্রাম কাজ করে।

ওভারলোড ফাংশন
ওভারলোডেড ফাংশন একই নামের ফাংশন কিন্তু ভিন্ন ফাংশন স্বাক্ষর। অন্য ব্যতিক্রম হিসাবে, একই নামের ওভারলোডেড ফাংশন একই সুযোগে সংজ্ঞায়িত করা যেতে পারে। নিম্নলিখিত প্রোগ্রামটি এটিকে ব্যাখ্যা করে:

#অন্তর্ভুক্ত
ব্যবহার নামস্থানঘন্টার;

অকার্যকরfn(intএকের উপর)
{
খরচ<<একের উপর<<'n';
}

অকার্যকরfn(ভাসানা)
{
খরচ<<না<<'n';
}

intপ্রধান()
{
fn(5);
ভাসাফ্ল্যাট= 8.7;
fn(ফ্ল্যাট);

প্রত্যাবর্তন 0;
}

আউটপুট হল:
5
8.7

ওভারলোডেড ফাংশনগুলি বৈশ্বিক পরিসরে সংজ্ঞায়িত করা হয়েছে।

নেমস্পেস স্কোপ

নেমস্পেস স্কোপ তার নিজস্ব নিবন্ধের যোগ্য। এই নিবন্ধটি linuxhint.com ওয়েবসাইটের জন্য লেখা হয়েছে। শুধু এই সাইটের সার্চ বক্সে সার্চ শব্দ নেমস্পেস স্কোপ টাইপ করুন (পৃষ্ঠা) এবং ঠিক আছে ক্লিক করুন, এবং আপনি নিবন্ধটি পাবেন।

বিভিন্ন অংশে ব্যাপ্তি

শ্রেণী একমাত্র স্কিম নয় যেখানে সুযোগ বিভিন্ন অংশে হতে পারে। বন্ধু স্পেসিফায়ার, বিস্তারিত-টাইপ-স্পেসিফায়ারের নির্দিষ্ট ব্যবহার, এবং ব্যবহার-নির্দেশনা অন্যান্য স্কিম যেখানে সুযোগ বিভিন্ন জায়গায় রয়েছে-বিস্তারিত জানার জন্য, পরে দেখুন।

উপসংহার

একটি সুযোগ একটি ঘোষণামূলক অঞ্চল। একটি ঘোষণামূলক অঞ্চল একটি প্রোগ্রাম পাঠ্যের বৃহত্তম অংশ যেখানে একটি সত্তার নাম বৈধ। এটি নির্দিষ্ট প্রোগ্রামিং স্কিম, যেমন নেস্টেড ব্লক অনুসারে একাধিক ভাগে ভাগ করা যায়। যে অংশে ডিক্লারেশন পয়েন্ট নেই সেগুলি সম্ভাব্য সুযোগ তৈরি করে। সম্ভাব্য সুযোগ ঘোষণা হতে পারে বা নাও থাকতে পারে।