এখানে দুটি আলাদা কনসেপ্ট কাজ করে:
- স্কোপ (Scope) — যা নির্ধারণ করে একটি নাম কোথা থেকে অ্যাক্সেস করা যাবে: গ্লোবাল এবং লোকাল
- স্টোরেজ ডিউরেশন (Storage Duration) — যা নির্ধারণ করে একটি ভেরিয়েবল কখন তৈরি এবং ধ্বংস হবে: স্ট্যাটিক এবং অটো
স্কোপ (Scope)
লোকাল ভেরিয়েবল শুধু সেই ফাংশন বা কোড ব্লকের ভিতরের স্টেটমেন্টগুলো দ্বারা ব্যবহার করা যায়। লোকাল ভেরিয়েবল ফাংশনগুলোকে স্বতন্ত্রভাবে জানা যাবে না।
উদাহরণ
#include <iostream>
using namespace std;
int main() {
// লোকাল ভেরিয়েবল ডিক্লেয়ারেশন:
int a, b;
int c;
// আসল ইনিশিয়ালাইজেশন
a = 10;
b = 20;
c = a + b;
cout << c;
return 0;
}
আউটপুট:
30
গ্লোবাল ভেরিয়েবল সকল ফাংশনের বাইরে ডিফাইন করা হয়, সাধারণত প্রোগ্রামের শুরুতে। গ্লোবাল ভেরিয়েবল প্রোগ্রামের পুরো লাইফটাইম ধরে তার মান ধরে রাখে। একটি গ্লোবাল ভেরিয়েবল যেকোনো ফাংশন থেকে অ্যাক্সেস করা যায়।
উদাহরণ
#include <iostream>
using namespace std;
// গ্লোবাল ভেরিয়েবল ডিক্লেয়ারেশন:
int g;
int main() {
// লোকাল ভেরিয়েবল ডিক্লেয়ারেশন:
int a, b;
// আসল ইনিশিয়ালাইজেশন
a = 10;
b = 20;
g = a + b;
cout << g;
return 0;
}
আউটপুট:
30
স্টোরেজ ডিউরেশন (Storage Duration)
অটোম্যাটিক (Automatic) ভেরিয়েবল হলো লোকাল ভেরিয়েবল যাদের লাইফটাইম তাদের স্কোপ ছেড়ে যাওয়ার সাথে সাথে শেষ হয়, এবং স্কোপ পুনরায় এন্টার করলে সেগুলো পুনরায় তৈরি হয়।
উদাহরণ
for (int i = 0; i < 5; ++i) {
int n = 0;
printf("%d ", ++n); // প্রিন্ট হবে 1 1 1 1 1 - পূর্বের মান হারায় গেছে
}
স্ট্যাটিক (Static) ভেরিয়েবল-এর লাইফটাইম প্রোগ্রামের শেষ পর্যন্ত থাকে। যদি সেগুলো লোকাল ভেরিয়েবল হয়, তবে তাদের মান স্কোপ ছেড়ে যাওয়ার পরো বèche থাকে।
for (int i = 0; i < 5; ++i) {
static int n = 0;
printf("%d ", ++n); // প্রিন্ট হবে 1 2 3 4 5 - মান বসে থাকে
}
নোট: static কীওয়ার্ডের স্টোরেজ ডিউরেশনের বাইরে এবং भी অনেক অর্থ আছে। এছাড়া, C++-এ auto কীওয়ার্ড আর অটোম্যাটিক স্টোরেজ ডিউরেশন বোঝায় না; এখন এটি ভেরিয়েবলের ইনিশিয়ালাইজার থেকে টাইপ অনুমান করাকে বোঝায় (type deduction)।