هل يتم استدعاء Copy Constructor في C++ عند إرجاع الكائن من دالة؟

StackOverflow https://stackoverflow.com/questions/665781

سؤال

أفهم أنه يتم استدعاء مُنشئ النسخ في ثلاث حالات

  1. عند إنشاء كائن واحد وتهيئته بقيم من كائن آخر.
  2. عند تمرير كائن من حيث القيمة.

3.عندما يتم إرجاع كائن من دالة حسب القيمة.

لدي سؤال مع رقم 3 إذا تم استدعاء مُنشئ النسخ عند إرجاع قيمة الكائن ، ألا ينبغي أن تخلق مشاكل إذا تم الإعلان عن الكائن محليًا في الوظيفة.

أعني أن مُنشئ النسخ عبارة عن نسخة عميقة ويأخذ إشارة إلى كائن كمعلمة

هل كانت مفيدة؟

المحلول

يتم استدعاؤه بالضبط لتجنب المشاكل.تتم تهيئة كائن جديد يعمل كنتيجة من الكائن المحدد محليًا، ثم يتم إتلاف الكائن المحدد محليًا.

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

نصائح أخرى

يتم إجراء النسخ قبل خروج الدالة المطلوبة، ونسخ المتغير المحلي الموجود آنذاك إلى القيمة المرجعة.

تتمتع الوظيفة المستدعىة بإمكانية الوصول إلى الذاكرة التي ستشغلها القيمة المرجعة، على الرغم من أن تلك الذاكرة ليست "في النطاق" عند عمل النسخة، إلا أنها لا تزال متاحة.

وفق إجابة على سؤالي، منشئ النسخة يمكن أن يسمى ولو مرتين:مرة واحدة لنسخ كائن محلي إلى "الكائن" المرتجع، ومرة ​​واحدة لنسخ كائن الإرجاع إلى المتغير الذي تم تعيينه له.

ومع ذلك، فإنه لا داعي لذلك يكون!يمكن للمترجم تحسين كلا إنشاءات النسخ بعيدًا.

لا، يطلق عليه قبل أن يتم تدمير السكان المحليين.يمكنك اختبار ذلك باستخدام كائن يسجل التدمير ونسخ البناء، أو من خلال النظر إلى رمز التجميع الذي تم إنشاؤه.

هناك ثلاث حالات عامة يتم فيها استدعاء مُنشئ النسخة:

  1. عند إنشاء كائن واحد وتهيئته بقيم من كائن آخر (من نفس النوع).
  2. عند تمرير كائن من حيث القيمة.
  3. عندما يتم إرجاع كائن من دالة حسب القيمة.
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top