C++ এর একক সবচেয়ে গুরুত্বপূর্ণ বৈশিষ্ট্য হল class
class হল মেকানিজম যা বস্তু তৈরি করতে ব্যবহৃত হয়। যেমন, class
অনেক C++ বৈশিষ্ট্যের কেন্দ্রে রয়েছে। class তাই মৌলিক
C++ প্রোগ্রামিং এর জন্য এখানে একটি সংক্ষিপ্ত বিবরণ প্রয়োজন। class কীওয়ার্ড ব্যবহার করে একটি class declare করা হয়। একটি শ্রেণি declareর সিনট্যাক্স একটি কাঠামোর অনুরূপ।
এর সাধারণ ফর্ম এখানে দেখানো হয়েছে:
class class-name{
// private functions & variable
public:
// public functions & variable
}
object-list;
একটি class declare , object-list একটি কাঠামোর মতো, আপনি প্রয়োজন অনুসারে class অবজেক্টগুলি পরে declare করতে পারেন। যদিও class-name প্রযুক্তিগতভাবে ঐচ্ছিক, একটি ব্যবহারিক দৃষ্টিকোণ থেকে এটি কার্যত সর্বদা প্রয়োজন। এর কারণ হল class-nameএকটি নতুন টাইপ name হয়ে যায় যা class এর অবজেক্ট declare করতে ব্যবহৃত হয়।
একটি class declare ভিতরে ঘোষিত ফাংশন এবং ভেরিয়েবলগুলিকে সেই class member বলে বলা হয়। ডিফল্টরূপে, একটি class এর ভিতরে ঘোষিত সমস্ত ফাংশন এবং ভেরিয়েবল সেই class এর জন্য private।
এর মানে হল যে তারা শুধুমাত্র সেই class এর অন্যান্য member দ্বারা অ্যাক্সেসযোগ্য। public class member declare করার জন্য, public কীওয়ার্ড ব্যবহার করা হয়, একটি কোলন দ্বারা অনুসরণ করা হয়। public স্পেসিফায়ারের পরে ঘোষিত সমস্ত ফাংশন এবং ভেরিয়েবল class এর অন্যান্য member এবং class ধারণ করে এমন প্রোগ্রামের অন্য কোনও অংশ দ্বারা উভয়ই অ্যাক্সেসযোগ্য।
এখানে একটি সাধারণ class declaration:
class myclass {
// private to myclass
int a;
public:
void set_a (int num);
int get_a();
- class এর একটি privaate ভেরিয়েবল আছে, যাকে বলা হয় a, এবং দুটি public ফাংশন, set_a() এবং get_a() লক্ষ্য করুন যে ফাংশনগুলি তাদের প্রোটোটাইপ ফর্মগুলি ব্যবহার করে একটি class এর মধ্যে declare করা হয়েছে। যে ফাংশনগুলিকে class এর অংশ হিসাবে declare করা হয় তাকে member ফাংশন বলে। যেহেতু একটি private, এটি myclass এর বাইরে কোনো কোড দ্বারা অ্যাক্সেসযোগ্য নয়। যাইহোক, যেহেতু set_a() এবং get_a() myclass এর member, অ্যাক্সেস করতে পারেন a. আরও, get_a() এবং set_a() myclass-এর public member হিসাবে declare করা হয় এবং myclass ধারণ করে এমন প্রোগ্রামের অন্য কোনও অংশ দ্বারা call করা যেতে পারে।
- যদিও ফাংশন get_a() এবং set_a() myclass দ্বারা ঘোষিত, তারা এখনও সংজ্ঞায়িত করা হয়নি। একটি member ফাংশন সংজ্ঞায়িত করতে, আপনাকে অবশ্যই ফাংশনের নামের সাথে class এর টাইপ name লিঙ্ক করতে হবে। আপনি ফাংশনের নামের পূর্বে class এর নামের সাথে দুটি কোলন অনুসরণ করে এটি করবেন। দুটি কোলনকে স্কোপ রেজোলিউশন (scope resolution) অপারেটর বলা হয়।
উদাহরণস্বরূপ, এখানে member ফাংশন set_a() এবং get_a() সংজ্ঞায়িত করা হয়েছে:
void myclass ::set_a(int num)
{
a = num;
}
int myclass ::get_a()
{
return a;
}
লক্ষ্য করুন যে set_a() এবং get_a() উভয়েরই একটি অ্যাক্সেস রয়েছে, যা myclass এর private। যেহেতু set_a() এবং get_a() myclass এর member, তারা সরাসরি এর private ডেটা অ্যাক্সেস করতে পারে।
সাধারণভাবে, একটি member ফাংশন সংজ্ঞায়িত করতে আপনাকে অবশ্যই এই ফর্মটি ব্যবহার করতে হবে:
ret-type class-name::func-name(parameter-list)
{
// body of function
}
- এখানে class-name হল সেই class এর name যার সাথে ফাংশনটি অন্তর্গত myclass-এর declare myclass ধরনের কোনো অবজেক্টকে সংজ্ঞায়িত করেনি-এটি কেবলমাত্র বস্তুর ধরণকে সংজ্ঞায়িত করে যেটি বাস্তবে declare করা হলে তৈরি করা হবে। একটি অবজেক্ট তৈরি করতে, class এর নামটি a হিসাবে ব্যবহার করুন টাইপ স্পেসিফায়ার।
উদাহরণস্বরূপ, এই লাইনটি myclass টাইপের দুটি অবজেক্ট declare করে:
myclass object1, object2; // thase are objets of type myclass
⦁ একটি শ্রেণী declare একটি যৌক্তিক বিমূর্ততা যা একটি নতুন ধরনের সংজ্ঞায়িত করে। এটি নির্ধারণ করে যে ধরনের একটি বস্তু কেমন হবে। একটি বস্তুর declare সেই ধরনের একটি শারীরিক সত্তা তৈরি করে। অর্থাৎ, একটি বস্তু memory স্থান দখল করে , কিন্তু একটি টাইপ সংজ্ঞা নয়।
⦁ একবার class এর একটি অবজেক্ট তৈরি হয়ে গেলে, আপনার প্রোগ্রামটি "ডট" (period) অপারেটর ব্যবহার করে তার public memberদের উল্লেখ করতে পারে যেভাবে কাঠামোর member অ্যাক্সেস করা হয়। পূর্ববর্তী অবজেক্ট ডিক্লারেশন ধরে নিলে, নিম্নলিখিত বিবৃতিটি object1 এবং object2 অবজেক্টের জন্য set_a() কে call করে
object1.set_a(10); // sets object1"s version of a to 10
object2.set_a (99); // sets object2"s vession of a to 99
যেমন মন্তব্যগুলি ইঙ্গিত করে, এই বিবৃতিগুলি a থেকে 10 এর object2 এর অনুলিপি সেট করে এবং object2 এর কপি 99 এ।
উদাহরণ:
1. একটি সাধারণ প্রথম উদাহরণ হিসাবে, এই প্রোগ্রামটি টেক্সটে বর্ণিত myclass প্রদর্শন করে। এটি object1 এবং object2 এর জন্য a এর মান সেট করে এবং তারপর প্রতিটি বস্তুর জন্য a এর মান প্রদর্শন করে:
# include <iostream>
using namespace std;
class myclass {
//private to myclass
int a;
public:
void set_a (int num);
int get_a();
};
void myclass::set_a(int num)
{
a = num;
}
int myclass::Get_a()
{
return a;
}
int main()
{
myclass object1, object2;
object1.set_a(10);
object2.set_a(99);
cout << object1.get_a() << "\n";
cout << object2.get_a() << "\n";
return 0;
}
এই প্রোগ্রামটি স্ক্রিনে 10 এবং 99 মান প্রদর্শন করে।
উদাহরণস্বরূপ, ধরে নিচ্ছি যে myclass পূর্ববর্তী উদাহরণে দেখানো হিসাবে সংজ্ঞায়িত করা হয়েছে, নিম্নলিখিত main() ফাংশনটি একটি ত্রুটি সৃষ্টি করবে:
// এই খণ্ডটিতে একটি ত্রুটি রয়েছে৷
#include <iostream>
using namespace std;
int main()
{
myclass object1, object2;
object1.a = 10; // ERROR! can"t access private member
object2.a = 99 ; // non-member function
cout << object1.get_a() << "\n";
cout << object2.get_a() << "\n";
return 0;
}
যেমনটি এখানে দেখানো হয়েছে:
#include <iostream>
using namespace std;
class myclass
{
public:
// এখন একটি public
int a;
// এবং set_a() বা get_a() এর কোন প্রয়োজন নেই
};
int main()
{
myclass object1, object2;
// এখানে a সরাসরি অ্যাক্সেস করা হয়
object1.a = 10;
object2.a = 99;
cout << object1.a << "\n";
cout << object2.a< "\n";
return 0;
}
- এই উদাহরণে, যেহেতু a কে myclass-এর public member হিসাবে declare করা হয়েছে, এটি main() থেকে সরাসরি অ্যাক্সেসযোগ্য। লক্ষ্য করুন কিভাবে dot অপারেটর একটি অ্যাক্সেস করতে ব্যবহৃত হয়। সাধারণভাবে, যখন আপনি একটি member ফাংশন call করছেন বা বাইরে থেকে একটি member ভেরিয়েবল অ্যাক্সেস করছেন এর class, অবজেক্টের name dot অপারেটর দ্বারা অনুসরণ করে memberএর নামটি সম্পূর্ণরূপে উল্লেখ করতে হবে যে আপনি কোন object member এর কথা বলছেন।
#include <iostream>
using namespace std;
#define SIZE 10
// character-এর class stack এর জন্য একটি declare করুন
stack class {
char stack [SIZE]; // stack memory
int val1 ; // stack এরর শীর্ষের সূচক
public:
void init(); // stack initialization
void push (char); // stack এর উপর characte
char val2(); // stack থেকে val2 character
};
// stack শুরু করুন
void stack::init()
{
val1 = 0;
}
// একটি character push.
void stack::push(char)
{
if (val1==SIZE) {
cout << "stack-টি পূর্ণ";
return;
}
stack[val1] = ch;
val1++;
}
// একটি charactar val2 করুন।
char stack::val2()
{
if (val1==0) {
cout << "stack-টি খালি")
return 0;
}
val--;
return stack[val1];
}
int main()
stack stk1, stk2; // দুটি stack তৈরি করুন
int i;
// stack শুরু করুন
stk1.init();
stk2.init();
stk1.push("x");
stk2.push("a");
stk1. push("y");
stk2.push("b");
stk1.push("z");
stk2.push("c");
for(i=0; i<3; i++) cout << "val2 stk1: " << stk1.val2() << "\n";
for(i=0; i<3; i++) cout << "val2 stk2: " << stk2.val2() <<< "\n";
return 0;
}
এই প্রোগ্রামটি নিম্নলিখিত আউটপুট প্রদর্শন করে:
val2 stk1: z
val2 stk1: x
val2 stk1: y
val2 stk2: c
val2 stk2:b
val2 stk2: a
আসুন এখন এই প্রোগ্রামটি ঘনিষ্ঠভাবে দেখে নেওয়া যাক। class stack এর দুটি private ভেরিয়েবল রয়েছে:
- stack এবং val1 array stack আসলে stack এর উপর push করা character-গুলিকে ধরে রাখে এবং val1-এ stack এর শীর্ষে সূচী থাকে। public stack ফাংশনগুলি হল init(), push(), এবং val2(), যা stack শুরু করে, একটি মান push করে এবং একটি মান val2 করে।
- main() এর ভিতরে, দুটি stack, stk1 এবং stk2, তৈরি করা হয় এবং প্রতিটি stack এরর উপর তিনটি character push করা হয়। এটা বোঝা গুরুত্বপূর্ণ যে প্রতিটি stack অবজেক্ট অন্য থেকে আলাদা। অর্থাৎ, stk1-এ ঠেলে দেওয়া characterগুলি কোনওভাবেই stk2-এ push করা character-গুলিকে প্রভাবিত করে না। প্রতিটি বস্তুর stack এবং val1 এর নিজস্ব অনুলিপি রয়েছে। এই ধারণাটি অবজেক্ট বোঝার জন্য মৌলিক। যদিও একটি class এর সমস্ত অবজেক্ট তাদের member ফাংশন ভাগ করে, প্রতিটি অবজেক্ট তার নিজস্ব তৈরি ডেটা বজায় রাখে।
0 Comments