অবজেক্ট অরিয়েন্টেড সি++ এবং Access Modifiers

Public vs Private vs Protected

চলেন আবার কথা বলি আমাদের গাড়ি নিয়ে। গাড়ি আসলেই একটা মজার জিনিস, কিন্তু লায়াবিলিটি, খালি খরচ বাড়ায়। যাই হোক অই দিকে যেয়ে আমাদের লাভ নেই আপাতত। ধরেন একটি গাড়ির ড্রাইভার, সে গাড়ি চালাচ্চে, এখন সে দেখলে সামনে রেড সিগন্যাল পরছে, গাড়ি তো থামাতে হবে। তাই গাড়ি থামানোর জন্য সে ব্রেক প্যাডেলে চাপ দিবে এবং আস্তে আস্তে গাড়িটা থামবে।

লক্ষ্য করবেন এখানে ড্রাইভার জানেন যে তার গাড়িটা ব্রেক করে স্টপ করতে হবে, কিন্তু এটা জানে না কীভাবে এই আসলেই এই গাড়িটা স্টপ হচ্ছে। অনেকেই জানে না গাড়িটার ইঞ্জিনের ভিতর কীভাবে কাজ করছে এবং কীভাবে ব্রেক প্যাডেলে চাপ দেয়ার সাথে সাথে গাড়ির ইঞ্জিনটা ঠিক কি করে গাড়িটাকে থামাচ্ছে। তো এটা হচ্ছে একটি ইঞ্জিনের ভিতরের খবর। এটাকে বলে তথ্য লুকানো অথবা DATA HIDING.

সি++ এ Access Modifiers এর কাজ হচ্ছে তথ্য লুকানো, এটা অবজেক্ট অরিয়েন্টেড প্রোগ্রামিং এর সবচেয়ে গুরুত্বপূর্ণ ফিচার এবং এটাকে বলে DATA HIDING. আচ্ছা গাড়ির ইঞ্জিনের কাজটা না হয় বুঝলাম, কিন্তু সি++ এ এই Access Modifiers এর কাজটা কি?

অবজেক্ট অরিয়েন্টেড প্রোগ্রামিং এ আমরা Access Modifiers ব্যবহার করে আমরা Class গুলোর ব্যবহার অথবা Accessibility সীমিত করতে পারি। Access Modifiers এর কাজই এটা শুধু। কোডে আমরা এটা ব্যবহার করে কিছু রেস্ট্রিকশন বসাতে পারি, যাতে আমাদের তথ্য গুলো নিরাপদ থাকে এবং নির্দিষ্ট ফাংশনের বাইরে এবং কোডের বাইরে অর্থাৎ বাইরের বিশ্বে সেই তথ্য গুলো প্রকাশ না পায়।

৩ ধরনের Access Modifiers আছে সি++ ল্যাংগুয়েজে। সেগুলো হচ্ছে —

  1. Public
  2. Private
  3. Protected
নোটঃ সি++ এ Class এর ভিতর মেম্বার দের যদি কোনো প্রকারের Access Modifiers ডিফাইন করা না হয়, তাহলে ডিফল্ট ভাবে সেই মেম্বার গুলো Private হয়ে যাবে।

১. পাবলিক (Public) —

ধরেন অক্সিজেন। এইটাতে কেও আপনাকে বাধা দিতে পারবে না, আপনার আমার যখন লাগবে তখনই ব্যবহার করতে পারতেছি যেকোনো জায়গা থেকে। তো এই অক্সিজেন হচ্ছে Public Modifier। Public এর আন্ডারে যেসকল ডেটা মেম্বারদের ডিক্লায়ার করা হবে সেগুলো কোডের ভিতর যেকোনো ফাংশন ব্যবহার এবং কল করতে পারবে। সেই ডেটা গুলোকে আবার বাইরের Class গুলোও ব্যবহার করতে পারবে। পাবলিক ক্লাশের সাথে শুধুমাত্র (.) ডট অপারেটর ব্যবহার করে সরাসরিভাবে ক্লাশের ভিতরের ডেটা মেম্বারদের এক্সেস করা যাবে। নিচের কোডটি দেখলে বুঝতে পারবেন ভালো করে —

আউটপুট হবে —

Radius is: 3.5 
Area is: 38.465

উপরের প্রোগ্রামটিতে ডেটা মেম্বার Radius পাবলিক ছিলো তাই মেইন ফাংশন থেকে ball নামক অবজেক্টটি ক্লাশের বাইরে একে এক্সেস করতে পারছে।


২. প্রাইভেট (Private) —

এবার চলেন একটু আমাদের ঘর থেকে ঘুরে আসি। নাহ খাইতে না। কথা বলবো আমাদের বাসার আলো নিয়ে। অন্ধকারে আমরা বাসায় আলো জালাই। এখন এই আলোটা শুধু বাড়ির ভিতরের মানুষজনই কিন্তু ব্যবহার করতে পারবে। মাঝেমধ্যে দরকার পড়লে আমাদের পাশের বাসার লোকজনই ব্যবহার করতে পারবে কিন্তু দরকার হলে শুধু। তাছাড়া বাড়ির বাইরের কেও এই আলো ব্যবহার করতে পারবে না।

এখন ধরে নেন, এই বাড়িটা হচ্ছে সি++ এর একটি ফাংশন এবং আলোটা হচ্ছে এখানে ডেটা মেম্বার এবং আমাদের পাশের বাসাটা হচ্ছে বন্ধু ফাংশন অথবা Friend Function। চলেন নিচের কোডটা একবার দেখে নেই —

উপরের কোডটি কম্পাইল করলে আমাদেরকে Error দেখাবে। কারন আমরা প্রাইভেট ডেটা মেম্বার গুলোকে তাদের ক্লাশের বাইরে সরাসরি এক্সেস করতে পারবো না।

আউটপুট হবে —

 In function 'int main()': 
10:16: error: 'double Circle::radius' is private
22:10: error: within this context
10:16: error: 'double Circle::radius' is private
24:35: error: within this context

আমরা এটাকে ঠিক করতে পারবো প্রাইভেট ডেটা মেম্বারের ক্লাশে থাকা পাবলিক ফাংশনটিকে ব্যবহার করে। সেটার জন্য কী করতে হবে তা নিচের কোডে দেখতে পারবেন —

আউটপুট হবে —

Radius is: 3.5 
Area is: 38.465

৩. প্রোটেকটেড (Protected) —

প্রোটেকটেড Access Modifier অনেকটাই প্রাইভেটের মতোন, শুধু পার্থক্যটা হচ্ছে Class এর ভিতরে প্রোটেকটেড ডিক্ল্যায়ার করা ডেটা মেম্বার গুলোকে Class এর বাইরে থেকে কল করা যায় না ঠিকই কিন্তু অই Class এর ভিতরে থাকা অন্যান্য Sub Class(derived class) রা এক্সেস করতে পারবে। এইখানে Class এবং derived class এর সম্পর্কটাকে Parent-Child সম্পর্ক বলা হয়। চলুন একটা প্রোগ্রাম দেখে নেই, তাহলে ভালভাবে বুঝা যাবে —

আউটপুট হবে —

Protected Number is: 2

অবজেক্ট অরিয়েন্টেড প্রোগ্রামিং নিয়ে আমার আগের লিখা গুলো পড়তে পারবেন আমার ব্যক্তিগত ব্লগ এবং মিডিয়াম থেকে —

আজকে এই পর্যন্তই। ধন্যবাদ সাথে থাকার জন্য।

#হ্যাপি_প্রোগ্রামিং


আমার ব্যাক্তিগত ব্লগ —

বাংলা ভার্শন — https://with.dibakar.me/

ইংলিশ ভার্শন — https://with.dibakar.me/en/

আমাকে পাবেন —

ফেসবুকে — https://www.facebook.com/dipu.dibakar

মিডিয়ামে — https://medium.com/@iamdibakardipu

টুইটারে — https://twitter.com/iamdibakardipu

ইনস্টাগ্রামে — https://www.instagram.com/dibakardipu/

গিটহাবে — https://github.com/dibakarsutradhar

লিঙ্কড ইনে — https://linkedin.com/in/dibakardipu/