কম্পিউটার

C++ তিনটির নিয়ম।


তিনটির নিয়ম হল একটি ব্যতিক্রম নিরাপদ কোড তৈরির জন্য C++ এর নিয়মগুলির মধ্যে একটি। এই নিয়মগুলি ক্লাসের ডিফল্ট সদস্যদের ব্যতিক্রম মুক্ত অনুশীলনের জন্য কীভাবে ব্যবহার করা উচিত তা নির্ধারণ করে৷

তিনটির নিয়মটি বিগ থ্রি বা দ্য বিগ থ্রি আইন নামেও পরিচিত এবং ক্লাসের জন্য নির্ধারিত করে, যদি একটি শ্রেণী উল্লেখিত তিনটির যে কোনো একটিকে সংজ্ঞায়িত করে তাহলে সম্ভবত তিনটিই স্পষ্টভাবে সংজ্ঞায়িত করা উচিত -

  • ধ্বংসকারী
  • কপি কনস্ট্রাক্টর
  • অ্যাসাইনমেন্ট কনস্ট্রাক্টর কপি করুন

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

এটি ঘটে কারণ অন্তর্নিহিতভাবে তৈরি করা কনস্ট্রাক্টর এবং অ্যাসাইনমেন্ট অপারেটর ডেটা সদস্যদের শ্যালোকপি করে। ক্লাসে যখন গতিশীলভাবে বরাদ্দকৃত সংস্থানগুলির দিকে নির্দেশক পয়েন্টার থাকে তখন আমাদের গভীর অনুলিপি প্রয়োজন৷

ডিফল্ট ধ্বংসকারীরা অব্যবহৃত বস্তুগুলি সরিয়ে দেয়। যখন কোন কপি কনস্ট্রাক্টর সংজ্ঞায়িত করা হয় না তখন ডেস্ট্রাক্টর দুবার চলবে, একবার কপি ধারণ করে এমন বস্তুর জন্য এবং দ্বিতীয়বার যে বস্তু থেকে ডেটা সদস্যদের কপি করা হয়। এটি এড়াতে, সুস্পষ্ট সংজ্ঞা প্রয়োজন।

আসুন একটি উদাহরণ দিয়ে বুঝতে পারি যেখানে কোনও কপি কনস্ট্রাক্টর নেই এবং কোনও কপি অ্যাসাইনমেন্ট অপারেটর নেই, তবে ডেস্ট্রাক্টর উপস্থিত রয়েছে -

উদাহরণ

#include <stdio.h>
class Numbers{
private:
   int num;
   int* ptr;
   public:
   Numbers( int n, int* p ) //copy constructor{
      num =n ;
      ptr = new int[ num ];
   }
   ~Numbers() //destructor{
      delete ptr;
      ptr = NULL;
   }
};
int main(){
   int arr[ 4 ] = { 11, 22, 33, 44 };
   Numbers Num1( 4, arr );
   // this creates problem
   Numbers Num2( Num1 );
   return 0;
}

আউটপুট

*** Error in `./a.out': double free or corruption (fasttop): 0x0000000001f46c20 ***
Aborted
  • এটি ঘটেছে কারণ যখন প্রোগ্রামটি সুযোগের বাইরে চলে যায় তখন ধ্বংসকারীকে দুবার বলা হয়। প্রথমে Num1 এবং তারপর Num2 এর জন্য মুছে ফেলা। ডিফল্ট কপি কনস্ট্রাক্টর পয়েন্টার পিটিআর এর একটি কপি তৈরি করে কিন্তু এর জন্য মেমরি বরাদ্দ করে না। সুতরাং, যখন Num1 সরানো হয় পরবর্তী ptrs প্রোগ্রামটি ক্র্যাশ করে।


  1. স্ট্রিং কপি করার জন্য C++ প্রোগ্রাম

  2. C++11-এ পাঁচের নিয়ম কী?

  3. C++-এ তিনের নিয়ম বনাম পাঁচের নিয়ম?

  4. C++ এর রেফারেন্স সহ তিনের নিয়ম কি?