"static const"
"static const" মূলত static (একটি স্টোরেজ স্পেসিফায়ার) এবং const (একটি টাইপ কোয়ালিফায়ার)-এর কম্বিনেশন।
static ভেরিয়েবলের লাইফটাইম এবং ভিজিবিলিটি/অ্যাক্সেসিবিলিটি নির্ধারণ করে। এর মানে যদি একটি ভেরিয়েবল static হিসেবে ডিক্লেয়ার করা হয়, তবে প্রোগ্রাম রান হওয়া পর্যন্ত সেটি মেমরিতে থাকবে, در কারন নরমাল বা অটো ভেরিয়েবল ফাংশনটি (যেখানে ভেরিয়েবল ডিফাইন করা হয়েছিল) শেষ হলে ডিস্ট্রয় হয়।
const হলো একটি টাইপ কোয়ালিফায়ার। একটি টাইপ কোয়ালিফায়ার টাইপ সিস্টেমের মাধ্যমে একটি ভ্যালু সম্পর্কে অতিরিক্ত ইনফরমেশন এক্সপ্রেস করতে ব্যবহৃত হয়। যখন একটি ভেরিয়েবল const টাইপ কোয়ালিফায়ার ব্যবহার করে ইনিশিয়ালাইজ করা হয়, তবে সেটি তার ভ্যালুতে আরও কোনো পরিবর্তন গ্রহণ করবে না।
সুতরাং static এবং const কম্বাইন করলে, আমরা বলতে পারি যে যখন একটি ভেরিয়েবল static const ব্যবহার করে ইনিশিয়ালাইজ করা হয়, তবে সেটি প্রোগ্রাম এক্সিকিউশন পর্যন্ত তার ভ্যালু ধরে রাখবে এবং 또한, এটি তার ভ্যালুতে কোনো পরিবর্তন গ্রহণ করবে না।
উদাহরণ
#include<iostream> using namespace std; int main(){ int input = 10; static const int value = 5; input += value; cout << input; return 0; }
"#define"
প্রিপ্রসেসর কমান্ডগুলোকে DIRECTIVES বলা হয়, এবং এগুলো পাউন্ড বা হ্যাশ সিম্বল (#) দিয়ে শুরু হয়। #-এর আগে কোনো হোয়াইট স্পেস থাকা উচিত নয়, এবং সেমিকোলন শেষে দরকার নয়।
প্রিপ্রসেসিং ফেজে অনেক কিছু করা যায় जिनमें شامل হলো
#include ডিরেক্টিভের মাধ্যমে অন্যান্য ফাইল ইনক্লুژن
#define ডিরেক্টিভের মাধ্যমে সিম্বলিক কনস্ট্যান্ট এবং ম্যাক্রো ডেফিনিশন
কিছু প্রিপ্রসেসর ডিরেক্টিভ ব্যবহার করে আপনি কন্ডিশনালি কম্পাইল বা কিছু প্রিপ্রসেসর ডিরেক্টিভ এক্সিকিউট করতে পারেন।
নোট - একটি C++ প্রোগ্রামের প্রিপ্রসেসিং ফেজ প্রোগ্রাম কম্পাইল হওয়ার আগে ঘটে। C++ প্রিপ্রসেসর একটি প্রোগ্রাম যা সোর্স কোড কম্পাইল হওয়ার আগে এক্সিকিউট হয়।
আপনি ইতিমধ্যে #include প্রিপ্রসেসর ডিরেক্টিভের সাথে কাজ করা শিখেছেন যা আপনাকে আপনার প্রোগ্রামে ডিজায়ারড হেডার ফাইল ইনক্লুড করতে দেয়। এই আলোচনাটি #define প্রিপ্রসেসর ডিরেক্টিভের प्रति সমর্পিত।
#define প্রিপ্রসেসর আমাদের সিম্বলিক নাম এবং কনস্ট্যান্ট ডিফাইন করতে দেয়। উদাহরণস্বরূপ,
#define PI 3.14159
এই স্টেটমেন্টটি প্রোগ্রামে PI-এর প্রতিটি অকারেন্সকে 3.14159-এ ট্রানস্লেট করবে।
C++ #define উদাহরণ
এখন পুরো উদাহরণটি বিবেচনা করুন যেখানে PI-এর প্রতিটি অকারেন্স 3.14159 দিয়ে রিপ্লেস হবে, যা #define ডিরেক্টিভে ডিফাইন করা মান।
ইনপুট: PI 3.14159 আউটপুট: Area of Circle 314.15
উদাহরণ
#include<iostream> using namespace std; #define PI 3.14159 int main() { int r = 10; float cir; cir = PI * (r * r); cout<<"Area of Circle: "<<cir<<endl; }
"enum"
enum হলো একটি ইউজার ডিফাইনড ডেটা টাইপ যেখানে আমরা একটি ভেরিয়েবলের জন্য একটি সেট ভ্যালু স্পেসিফাই করি এবং ভেরিয়েবলটি শুধু সম্ভাব্য ভ্যালুগুলোর একটি ছোট সেট থেকে একটি নিতে পারে। আমরা enum কীওয়ার্ড ব্যবহার করে একটি এনুমেরেশন ডিফাইন করি।
enum direction {East, West, North, South}dir;
এখানে এনুমেরেশনের নাম direction যা নির্দিষ্ট চারটি ভ্যালুর শুধু একটি নিতে পারে, ডিক্লেয়ারেশনের শেষে dir হলো একটি enum ভেরিয়েবল।
একটি সহজ উদাহরণ নিই এটি বুঝতে:
এখানে আমি enum ভেরিয়েবল dir-এ West ভ্যালু অ্যাসাইন করেছি এবং যখন dir-এর ভ্যালু ডিসপ্লে করলাম তবে এটি ১ দেখাল। এর কারণ হলো ডিফল্টভাবে ভ্যালুগুলো ০ থেকে শুরু করে ক্রমবর্ধমান ক্রমে থাকে, অর্থাৎ East হলো ০, West হলো ১, North হলো ২ এবং South হলো ৩।
ইনপুট: direction {East, West, North, South} dir=West আউটপুট: 1
উদাহরণ
#include<iostream> using namespace std; enum direction {East, West, North, South} dir; int main(){ dir = West; cout<<dir; return 0; }
enum ভেরিয়েবল ডিক্লেয়ার করার অন্য একটি পদ্ধতি
যে উদাহরণটি আমরা উপরে দেখেছি সেখানে আমি enum ডিক্লেয়ারেশনের সময় enum ভেরিয়েবল dir ডিক্লেয়ার করেছিলাম, enum ভেরিয়েবল ডিক্লেয়ার করার আরেকটি পদ্ধতি রয়েছে।
উদাহরণ
#include <iostream> using namespace std; enum direction {East, West, North, South}; int main() { direction dir; dir = South; cout<<dir; return 0; }
আউটপুট
3
C++-এ enum কেন ব্যবহার করা হয়
এখন যেহেতু আমরা বুঝেছি enum কী এবং প্রোগ্রামে কীভাবে ব্যবহার করতে হয়, চলুন আলোচনা করি কেন আমরা এগুলো ব্যবহার করি:
Enums শুধু তখনই ব্যবহার করা হয় যখন আমরা এক্সপেক্ট করি যে ভেরিয়েবলটির সম্ভাব্য ভ্যালু সেট থেকে একটি হবে, উদাহরণস্বরূপ, আমাদের একটি dir ভেরিয়েবল আছে যা ডিরেকশন ধারণ করে। যেহেতু চারটি ডিরেকশন আছে, এই ভেরিয়েবল চারটি ভ্যালুর যেকোনো একটি নিতে পারে, যদি আমরা এই ভেরিয়েবলে অন্য যেকোনো র্যান্ডম ভ্যালু অ্যাসাইন করার চেষ্টা করি, তবে এটি কম্পাইলেশন এরর থ্রো করবে। এটি কম্পাইল-টাইম চেকিং বাড়ায় এবং ইনভ্যালিড কনস্ট্যান্ট পাস করলে যে এররগুলো হয় সেগুলো এড়ায়।
এনাম যে আরেকটি গুরুত্বপূর্ণ জায়গায় ঘন ঘন ব্যবহৃত হয় সেটি হলো সвич কেস স্টেটমেন্ট, যেখানে সকল ভ্যালু যা কেস ব্লক এক্সপেক্ট করে সেগুলো একটি এনামে ডিফাইন করা যায়। এইভাবে আমরা নিশ্চিত করতে পারি যে সвич প্যারেনথেসিসে পাস করা enum ভেরিয়েবলটি এমন কোনো র্যান্ডম ভ্যালু নিচ্ছে না যা সেটি গ্রহণ করা উচিত নয়।