অ্যাসাইনমেন্ট অপারেটর এবং অনুলিপি নির্মাণকারীর মধ্যে পার্থক্য কী?


105

আমি অ্যাসাইনমেন্ট কনস্ট্রাক্টর এবং সি ++ তে কপির কনস্ট্রাক্টরের মধ্যে পার্থক্য বুঝতে পারি না। এটি এরকম:

class A {
public:
    A() {
        cout << "A::A()" << endl;
    }
};

// The copy constructor
A a = b;

// The assignment constructor
A c;
c = a;

// Is it right?

আমি জানতে চাই কীভাবে অ্যাসাইনমেন্ট কনস্ট্রাক্টর এবং কপি কনস্ট্রাক্টরের মেমরি বরাদ্দ করা যায়?


2
আপনার কি ভাল সি ++ বই আছে ?
sbi

উত্তর:


160

একটি অনুলিপি নির্মাণকারী অন্য কিছু অবজেক্টের ডেটা থেকে পূর্বনির্দেশিত বস্তুটি আরম্ভ করার জন্য ব্যবহৃত হয় ।

A(const A& rhs) : data_(rhs.data_) {}

উদাহরণ স্বরূপ:

A aa;
A a = aa;  //copy constructor

পূর্ববর্তী প্রাথমিক অবজেক্টের ডেটা অন্য কিছু সামগ্রীর ডেটার সাথে প্রতিস্থাপন করতে একটি অ্যাসাইনমেন্ট অপারেটর ব্যবহার করা হয় ।

A& operator=(const A& rhs) {data_ = rhs.data_; return *this;}

উদাহরণ স্বরূপ:

A aa;
A a;
a = aa;  // assignment operator

আপনি অনুলিপি নির্মাণ প্লাস অ্যাসাইনমেন্ট দ্বারা অনুলিপি নির্মাণ প্রতিস্থাপন করতে পারে, তবে এটি কম দক্ষ হবে।

(একটি পার্শ্ব দ্রষ্টব্য হিসাবে: উপরের আমার বাস্তবায়নগুলি হ'ল সংকলক আপনাকে নিখরচায় যা অনুদান দেয় তাই ম্যানুয়ালি এগুলি প্রয়োগ করার পক্ষে কোনও অর্থ হবে না these আপনার যদি এই দুটির একটি থাকে তবে সম্ভবত আপনি নিজে কিছু সংস্থান পরিচালনা করছেন। যে ক্ষেত্রে, প্রতি তিন রুল , আপনি খুব সম্ভবত অন্য এক প্লাস একটি বিনাশকারী প্রয়োজন হবে।)


4
কেবল একটি নোট: আজকাল (সি ++ 11 পরবর্তী), সেগুলি স্পষ্টভাবে ডিফল্ট করা যেতে পারে =default;
Deduplicator

2
@ ডিডুকিপ্লেটার এটি উল্লেখ করাও গুরুত্বপূর্ণ যে, যখন তুচ্ছ নির্মাণকারীর প্রয়োজন এমন শ্রেণিবিন্যাসকে মেনে চলতে হয় সেখানে আপনার অবশ্যই = default একটি ডিফল্ট কর্টার প্রয়োজন হয়: কেবল খালি শৃঙ্খলা বাস্তবায়নের মাধ্যমে এখনও ব্যবহারকারী নির্ধারিত কর্টর হিসাবে গণনা করা হয় এবং এভাবে (একটি স্ট্যান্ডার্ডিজ স্তরে) ) তুচ্ছ নয় এবং শ্রেণিবিন্যাস থেকে এমন ধরণের অযোগ্য ঘোষণা করে যা একটি তুচ্ছ কর্টরের প্রয়োজন।
আন্ডারস্কোর_ড

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

@ রাজেশ: আপনি যা জিজ্ঞাসা করছেন সে সম্পর্কে আমি বিভ্রান্ত, এবং আমার অনুভূতি হ'ল কারণ আপনিও বিভ্রান্ত। :)আপনি কী বলছেন তা বোঝানোর জন্য আবার চেষ্টা করবেন?
এসবিআই

1
@ ক্যাটালিনাসর্বু: আপনি পারতেন। এগুলি দুটি স্বতন্ত্র ফাংশন।
এসবিআই

41

অনুলিপি নির্মাণকারী এবং অ্যাসাইনমেন্ট অপারেটরের মধ্যে পার্থক্য নতুন প্রোগ্রামারদের জন্য প্রচুর বিভ্রান্তি সৃষ্টি করে, তবে এটি আসলে এতটা কঠিন নয়। সারমর্ম:

  • অনুলিপি হওয়ার আগে যদি কোনও নতুন অবজেক্ট তৈরি করতে হয় তবে অনুলিপি নির্মাণকারী ব্যবহার করা হবে।
  • অনুলিপিটি হওয়ার আগে যদি কোনও নতুন অবজেক্ট তৈরি করতে না হয় তবে অ্যাসাইনমেন্ট অপারেটর ব্যবহার করা হয়।

অ্যাসাইনমেন্ট অপারেটরের উদাহরণ:

Base obj1(5); //calls Base class constructor
Base obj2; //calls Base class default constructor
obj2 = obj1; //calls assignment operator

অনুলিপি নির্মাণকারীর উদাহরণ:

Base obj1(5);
Base obj2 = obj1; //calls copy constructor

এটা কি ন্যায়সঙ্গতভাবে বলা যায় যে একটি অ্যাসাইনমেন্ট অপারেটর কার্যকরভাবে একটি নতুন তৈরির সাথে একটি পুরানো অবজেক্টের ধ্বংসকে সংযুক্ত করে, তবে প্রোভিসগুলির সাথে যে (1) যদি পুরানো বস্তুর ধ্বংসের একটি পদক্ষেপ পূর্বেই পূর্বাবস্থায় ফিরে যায় তবে নতুনটির নির্মাণের একটি ধাপ, উভয় পদক্ষেপ বাদ দেওয়া যেতে পারে; (২) অ্যাসাইনমেন্ট অপারেটরদের খারাপ জিনিস করা উচিত নয় যদি কোনও বস্তু তাকে অর্পণ করা হয়।
সুপারক্যাট

কেন করছেন vector <A> v3এবং তারপরে v3 = v2 (যেখানে v2পূর্বে ঘোষিত এবং উপাদানগুলি রয়েছে vector<A>) আমার স্পষ্টকৃত Aঅনুলিপি নির্মাণকারীর পরিবর্তে কল করে operator=? আমি তার operator=পরিবর্তে ডাকা হবে বলে প্রত্যাশা করছিলাম copy constructorকারণ আমার v3অ্যাসাইনমেন্টটি সেই সময়ই ঘোষণা করা হয়েছিল যেখানে আমি অ্যাসাইনমেন্টটি দিয়েছিলাম
Cătlina Serrbu

19

প্রথমটি হ'ল অনুলিপি, দ্বিতীয়টি কেবল অ্যাসাইনমেন্ট। অ্যাসাইনমেন্ট কনস্ট্রাক্টরের মতো কোনও জিনিস নেই।

A aa=bb;

সংকলক উত্পাদিত অনুলিপি নির্মাণকারী ব্যবহার করে।

A cc;
cc=aa;

নির্মাণের জন্য ডিফল্ট কনস্ট্রাক্টর ব্যবহার করে ccএবং তারপরে operator =ইতিমধ্যে বিদ্যমান অবজেক্টে * এসাইনমেন্ট অপারেটর ** ( ) ব্যবহার করে।

আমি জানতে চাই কীভাবে অ্যাসাইনমেন্ট কনস্ট্রাক্টর এবং কপি কনস্ট্রাক্টরের মেমরি বরাদ্দ করতে হয়?

এক্ষেত্রে মেমরি বরাদ্দ বলতে কী বোঝায় আইডিকে তবে আপনি কী দেখতে চান তা দেখতে পারেন:

class A
{
public :
    A(){ cout<<"default constructor"<<endl;};
    A(const A& other){ cout<<"copy constructor"<<endl;};
    A& operator = (const A& other){cout <<"assignment operator"<<endl;}
};

আমি আপনাকে এক নজরে দেখুন:

রূপান্তর কনস্ট্রাক্টরের পরিবর্তে অনুলিপি নির্মাণকারীকে কেন বলা হয়?

তিনটির বিধি কী?


5

সাধারণ কথায়,

বিদ্যমান অবজেক্টের অনুলিপি হিসাবে কোনও বিদ্যমান অবজেক্ট থেকে নতুন অবজেক্ট তৈরি করা হলে কপির কনস্ট্রাক্টর বলা হয়। ইতিমধ্যে আরম্ভকৃত কোনও বস্তু অন্য বিদ্যমান অবজেক্ট থেকে নতুন মান নির্ধারিত হলে অ্যাসাইনমেন্ট অপারেটরকে ডাকা হয়।

নিদর্শন

t2 = t1;  // calls assignment operator, same as "t2.operator=(t1);"
Test t3 = t1;  // calls copy constructor, same as "Test t3(t1);"

4

@ লুচিয়ান গ্রিগোর যা বলেছে তা এভাবে প্রয়োগ করা হয়

class A
{
public :
    int a;
    A(){ cout<<"default constructor"<<endl;};
    A(const A& other){ cout<<"copy constructor"<<endl;};
    A& operator = (const A& other){cout <<"assignment operator"<<endl;}
};

void main()
{
    A sampleObj; //Calls default constructor
    sampleObj.a = 10;

    A copyConsObj  = sampleObj; //Initializing calls copy constructor

    A assignOpObj; //Calls default constrcutor
    assignOpObj = sampleObj; //Object Created before so it calls assignment operator
}

আউটপুট


ডিফল্ট নির্মাতা


কপি নির্মাণকারী


ডিফল্ট নির্মাতা


নিয়োগ অপারেটর



4

একটি অনুলিপি নির্মাণকারী এবং একটি কার্যনির্বাহী কনস্ট্রাক্টরের মধ্যে পার্থক্য হ'ল:

  1. একটি কপি কন্সট্রাকটর ক্ষেত্রে এটি একটি নতুন বস্তু তৈরি করে। ( <classname> <o1>=<o2>)
  2. কোনও অ্যাসাইনমেন্ট কনস্ট্রাক্টরের ক্ষেত্রে এটি কোনও বস্তু তৈরি করবে না এর অর্থ এটি ইতিমধ্যে নির্মিত বস্তুগুলিতে প্রয়োগ করা ( <o1>=<o2>)।

এবং উভয়ের মূল কার্যকারিতা একই, তারা o2 থেকে ও -1 সদস্য-সদস্যের ডেটা অনুলিপি করবে।


2

আমি এই বিষয়টিতে আরও একটি বিষয় যুক্ত করতে চাই। "অ্যাসাইনমেন্ট অপারেটরের অপারেটর ফাংশনটি কেবল শ্রেণীর সদস্য ফাংশন হিসাবে লেখা উচিত।" অন্যান্য বাইনারি বা ইউনিারি অপারেটরের বিপরীতে আমরা এটিকে বন্ধুত্বের ফাংশন হিসাবে তৈরি করতে পারি না।


1

অনুলিপি নির্মাণকারী সম্পর্কে কিছু যুক্ত করার জন্য:

  • মান দ্বারা কোনও বস্তু পাস করার সময়, এটি অনুলিপি নির্মাণকারী ব্যবহার করবে

  • কোনও বস্তু যখন মান দ্বারা কোনও ফাংশন থেকে ফিরে আসে, তখন এটি অনুলিপি নির্মাণকারী ব্যবহার করবে

  • যখন অন্য কোনও অবজেক্টের মান ব্যবহার করে কোনও বস্তুর সূচনা করার সময় (উদাহরণ হিসাবে আপনি দিয়েছেন)।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.