البرمجة

لماذا لا يُستدعى ال Constructor فى C++ عند تمرير الكائن بالقيمة؟

السبب في أنه لم يتم استدعاء الconstructor للكلاس A عند تمرير كائن من هذا الكلاس كوسيط (argument) لدالة تأخذ الوسيط بالقيمة، هو نتيجة لكيفية عمل النسخ بالقيمة (pass by value) في C++.

عند استدعاء الدالة f_n(a); في الدالة main، يتم إنشاء نسخة جديدة من الكائن a، وهذه النسخة تمثل نسخة مستقلة عن الكائن الأصلي وتحتوي على نفس القيم. لا تحتوي هذه النسخة على أي رابط بالكائن الأصلي، وبالتالي لا تحتاج إلى استدعاء الconstructor لإنشائها، بل يتم نسخ القيم من الكائن الأصلي إلى النسخة الجديدة.

وهذا يعني أن الconstructor للكلاس A لن يتم استدعاؤه في هذه الحالة، لأن النسخة الجديدة للكائن a تم إنشاؤها دون الحاجة إلى استدعاء الconstructor.

المزيد من المعلومات

عندما يتم تمرير الكائن كوسيط (by value)، يتم إنشاء نسخة جديدة من الكائن الأصلي. هذه النسخة الجديدة تمتلك قيم نفس الحقول كالكائن الأصلي، ولكنها تمتلك مكان في الذاكرة مختلف عن الكائن الأصلي. بمعنى آخر، النسخة الجديدة هي كائن مستقل تماماً عن الكائن الأصلي.

عندما يتم تمرير الكائن كوسيط، فإنه يتم استدعاء ما يعرف بال constructor المشتق (copy constructor) إذا كان متاحاً. إذا لم يتم توفير constructor مشتق، فإن C++ سيولّد تلقائيا constructor مشتق بشكل افتراضي. وظيفة constructor المشتق هي إنشاء نسخة من الكائن الأصلي بناءً على القيم الحالية للكائن الأصلي.

في حالة الكود الذي قدمته، لم يتم توفير constructor مشتق للكلاس A، ولكن C++ يقوم بإنشاء constructor مشتق افتراضي. هذا هو السبب في أنه لم يتم استدعاء ال constructor الأصلي الذي قمت بتعريفه عند تمرير الكائن a كوسيط في الدالة f_n.

زر الذهاب إلى الأعلى