موصى به, 2021

اختيار المحرر

الفرق بين نسخ المنشئ و عامل التشغيل في C ++

إنشئ المنشئ ومشغل التعيين ، هما طريقتان لتهيئة كائن واحد باستخدام كائن آخر. يتمثل الاختلاف الأساسي بين مُنشئ النسخ وعامل التخصيص في أن مُنشئ النسخ يخصص ذاكرة منفصلة لكل من الكائنات ، أي الكائن المستهدف المنشأ حديثًا وكائن المصدر. يخصص مشغل التعيين موقع الذاكرة نفسه إلى الكائن المستهدف المنشأ حديثًا وكذلك كائن المصدر.

دعونا ندرس الفرق بين مُنشئ النسخ ومشغّل المهمة.

رسم بياني للمقارنة

أساس للمقارنةنسخ منشئمهمة تشغيل
الأساسيةإنشئ النسخة هو منشئ overloaded.عامل التعيين هو عامل توصيل من جانب واحد.
المعنىيقوم مُنشئ النسخ بتهيئة الكائن الجديد بكائن موجود بالفعل.يعين مشغل التعيين قيمة كائن واحد إلى كائن آخر موجودان بالفعل.
بناء الجملةclass_name (تابع class_name و object_name) {
// الجسم من المنشئ
}
class_name Ob1، Ob2؛
Ob2 = Ob1.
يتضرع(1) يستدعي المنشئ نسخ عند تهيئة كائن جديد مع كائن موجود.
(2) يتم تمرير الكائن إلى دالة كمعامل غير مرجع.
(3) يتم إرجاع الكائن من الوظيفة.
يتم استدعاء عامل التعيين فقط عند تعيين كائن موجود كائن جديد.
تخصيص الذاكرةيشارك الكائن الهدف وكائن تهيئة مواقع الذاكرة المختلفة.كل كائن الهدف وكائن تهيئة يشارك نفس الذاكرة المخصصة.
افتراضيإذا لم تقم بتعريف أي مُنشئ نسخ في البرنامج ، يوفر مترجم C ++ ضمنيًا واحدًا.إذا لم تفرط في تحميل عامل التشغيل "=" ، فستُجرى نسخة تحضيرية.

تعريف منشئ نسخة

"منشئ النسخ" هو شكل من أشكال مُنشِط فوق طاقتها . يتم استدعاء أو إنشاء مُنشئ نسخة فقط لغرض التهيئة. يقوم مُنشئ النسخ بتهيئة الكائن الذي تم إنشاؤه حديثًا بواسطة كائن موجود آخر. عند استخدام مُنشئ نسخة لتهيئة الكائن المستهدف الذي تم إنشاؤه حديثًا ، فإن الكائن الهدف وكائن المصدر يشتركان في موقع ذاكرة مختلف. لا تعكس التغييرات التي تم إجراؤها على الكائن المصدر في الكائن الهدف. الشكل العام لمنشئ النسخة هو

 اسم الفئة (class_name و object_name) {. // body of copy constructor. } // object_name يشير إلى الكائن على الجانب الأيمن من التهيئة. 

إذا لم يقم المبرمج بإنشاء مُنشئ نسخة في برنامج C ++ ، فحينئذٍ يقدم المترجم ضمنيًا منشئ نسخة. يقوم المنشئ الضمني الذي يوفره المحول البرمجي بنسخة العضو من الكائن المصدر. ولكن ، في بعض الأحيان ، لا تكون النسخة الخاصة بالعضوية كافية ، حيث قد يحتوي الكائن على متغير مؤشر. يعني نسخ متغير مؤشر ، نقوم بنسخ العنوان المخزن في متغير المؤشر ، لكننا لا نريد نسخ العنوان المخزن في متغير المؤشر ، بدلاً من ذلك نريد نسخ ما يشير إليه المؤشر. ومن ثم ، هناك حاجة إلى "منشئ نسخ" صريح في البرنامج لحل هذا النوع من المشاكل.

يتم استدعاء منشئ نسخة في ثلاثة شروط على النحو التالي:

  • ينسخ المنشئ نسخ عند تهيئة كائن جديد مع كائن موجود.
  • تم تمرير الكائن إلى دالة كمعلمة غير مرجع.
  • يتم إرجاع الكائن من الوظيفة.

دعونا نفهم منشئ نسخة مع مثال.

 نسخة طبق الأصل {int num؛ public: copy () {} // default constructor copy (int a) {// initializing constructor num = a؛ } copy (copy & c) {/ copy copy constructor num = c.num؛ } void show () {cout << num؛ }}؛ int main () {copy A (200)؛ // Object A created and initialized copy B (A)؛ // copy constructor called copy C = A؛ // copy constructor called copy D؛ D = A؛ // copy constructor غير مسمى نظرًا لأن الكائن D لم يتم إنشاؤه حديثًا. // إنها عملية مهمة. العودة 0 ؛ } 

في الكود أعلاه ، أعلنت صراحة منشئ "نسخة (نسخة & c)". يتم استدعاء مُنشئ النسخة هذا عند تهيئة الكائن B باستخدام الكائن A. المرة الثانية التي يتم استدعاؤها عند تهيئة الكائن C باستخدام الكائن A. عند تهيئة الكائن D باستخدام الكائن A لا يتم استدعاء مُنشئ النسخ لأنه عندما يتم تهيئة D هي بالفعل في الوجود ، وليس الموجودة حديثًا. ومن هنا ، يتم استدعاء مشغل المهمة.

تعريف مشغل الإحالة

مشغل التعيين هو مشغل تخصيص C ++. يتم استخدام عامل التشغيل "=" لاستدعاء مشغل المهمة. يقوم بنسخ البيانات في كائن واحد مماثلًا إلى كائن آخر. يقوم مشغل التعيين بنسخ كائن إلى عضو آخر. إذا لم تقم بتحميل عامل التعيين الزائد ، فإنه ينفذ نسخة البت. لذلك ، تحتاج إلى زيادة حمولة عامل التعيين.

 نسخة طبق الأصل {int num؛ public: copy () {} // default constructor copy (int a) {// initializing constructor num = a؛ } void show () {cout << num؛ }}؛ int main () {copy A (200)؛ // Object A created and initialized copy B (300)؛ // الكائن B تم إنشاؤه وتهيئته B = A؛ // مشغل احالة استدعاء نسخة C ؛ C = A؛ // تم استدعاء عامل التعيين بالعودة 0؛ } 

في التعليمات البرمجية أعلاه عندما يتم تعيين objectA إلى كائن B يتم استدعاء عامل التعيين لأن الكائنات موجودة بالفعل. وبالمثل ، نفس الحالة عند تهيئة الكائن C مع كائن A.

عندما يتم تنفيذ تعيين البتات يشترك الكائن في نفس موقع الذاكرة وتظهر التغييرات في كائن واحد في كائن آخر.

الاختلافات الرئيسية بين نسخ المنشئ ومشغل الواجب

  1. إن مُنشئ النسخ هو مُعَمِّل مُحمَّل فوق طاقته حيث تكون مشغِّل التعيين عبارة عن مُعامِل bitwise.
  2. باستخدام منشئ النسخ يمكنك تهيئة كائن جديد باستخدام كائن موجود بالفعل. من ناحية أخرى ، يقوم مشغل التشغيل بنسخ كائن واحد إلى الكائن الآخر ، وكلاهما موجود بالفعل في الوجود.
  3. تتم تهيئة مُنشئ نسخة عند تهيئة كائن جديد باستخدام كائن موجود بالفعل ، عند تمرير كائن إلى دالة كمعلمة غير refrence ، أو عند إرجاع كائن من دالة. من ناحية أخرى ، يتم استدعاء عامل تعيين فقط عندما يتم تعيين كائن إلى كائن آخر.
  4. عند تهيئة كائن باستخدام مُنشئ النسخ ، يشارك كائن التهيئة والكائن الذي تمت تهيئته في موقع الذاكرة المختلفة. من ناحية أخرى ، عندما تتم تهيئة كائن باستخدام عامل تعيين ، فإن الكائنات التي تمت تهيئتها وتهيئتها تشارك نفس موقع الذاكرة.
  5. إذا لم تقم بتعريف مُنشئ نسخة بشكل صريح ، فسيقوم المترجم بتوفير واحدة. من ناحية أخرى ، إذا لم تقم بتحميل عامل تحميل إضافي ، يتم تنفيذ عملية نسخ.

استنتاج:

منشئ النسخ هو الأفضل لنسخ كائن واحد إلى آخر عندما يحتوي الكائن على مؤشرات raw.

Top