في لغة برمجة سي programming ، يعد منشئ النسخ أحد المفاهيم الرئيسية التي تسمح لك بإنشاء نسخ من الكائنات. عند إنشاء كائن من فئة ، يتم استدعاء منشئ النسخ تلقائيا لإنشاء نسخة من هذا الكائن. في هذه المقالة ، سنلقي نظرة على الحالات والقواعد التي يطلق عليها منشئ النسخ.
الحالة الرئيسية عند استدعاء منشئ النسخ هي إنشاء كائن جديد بناء على كائن موجود. يمكن أن يحدث هذا عند تعيين كائن إلى آخر ، أو عند تمرير كائن كمعلمة دالة ، أو عند إرجاع كائن من دالة. يتم استدعاء منشئ النسخ أيضا عند تهيئة عنصر صفيف.
من المهم ملاحظة أنه لا يمكن استدعاء منشئ النسخ إلا لكائنات الفئة ، أي أنواع البيانات المعرفة من قبل المستخدم. بالنسبة لأنواع البيانات البدائية ، مثل كثافة العمليات أو التعويم ، لن يتم استدعاء منشئ النسخ.
في ج++ ، يمكنك تحديد منشئ النسخ الخاص بك أو استخدام منشئ النسخ الذي تم إنشاؤه تلقائيا بواسطة المترجم. ومع ذلك ، إذا كان الفصل يحتوي على مؤشرات للذاكرة أو موارد أخرى ، فيجب عليك إنشاء منشئ النسخ الخاص بك لتجنب مشاكل تسرب الذاكرة أو تشغيل البرنامج بشكل غير صحيح.
- عندما يتم استدعاء منشئ النسخ في ج:: أمثلة وميزات
- معلومات عامة حول منشئ النسخ
- استدعاء منشئ النسخ عند إنشاء كائنات
- استدعاء منشئ النسخ عند تمرير الكائنات إلى الوظائف والأساليب
- استدعاء منشئ النسخ عند إرجاع الكائنات من الوظائف والأساليب
- أمثلة على استخدام منشئ النسخ في المواقف الحقيقية
- ملامح منشئ نسخة وتنفيذها
- سؤال وجواب
- ما هي الميزات والأمثلة على استدعاء منشئ نسخة في ج can يمكن أن تعطى?
- كيف يعمل منشئ النسخ في ج??
- لماذا أحتاج إلى استخدام منشئ النسخ في ج??
- متى يتم استدعاء منشئ النسخ في ج??
- هل من الممكن في ج not عدم تحديد منشئ نسخة?
- كيف يمكنني إعادة تعريف منشئ نسخة في ج??
عندما يتم استدعاء منشئ النسخ في ج:: أمثلة وميزات
في لغة البرمجة سي programming ، يتم استدعاء منشئ النسخ في عدد من الحالات عندما يكون من الضروري إنشاء كائن جديد بناء على كائن موجود. منشئ النسخ هو دالة عضو خاصة لفئة تأخذ كحجة إشارة إلى كائن من فئتها الخاصة.
فيما يلي المواقف الرئيسية عندما يتم استدعاء منشئ النسخ:
- عند إنشاء كائن جديد استنادا إلى كائن موجود بالفعل من نفس الفئة:
كلاسا أوبج1;
كلاسا أوبج2 (أوبج1); // استدعاء منشئ النسخ
- عند تمرير كائن حسب القيمة كوسيطة إلى دالة:
فواد فونك (كلاسا أوبج); كلاسا أوبج1;
فونك (أوبج 1) ؛ / / استدعاء منشئ نسخة
- عند إرجاع كائن من دالة حسب القيمة:
كلاسا فونك();
كلاسا أوبج1 = فونك () ؛ / / استدعاء منشئ نسخة
من المهم ملاحظة أنه في بعض الحالات يمكن للمترجم تحسين الكود وتجنب استدعاء منشئ النسخ. على سبيل المثال ، إذا كان الكائن مؤقتا أو إذا كان المترجم يستخدم رفو (قيمة الإرجاع الأمثل) أو نرفو (اسمه قيمة الإرجاع الأمثل).
يمكن تعريف منشئ النسخ بشكل صريح بواسطة المبرمج أو إنشاؤه ضمنيا بواسطة المترجم. إذا لم يتم تعريف منشئ النسخ بواسطة المبرمج ، فسيتم إنشاؤه بواسطة المحول البرمجي افتراضيا وسيؤدي نسخ البت لجميع أعضاء الفصل. ومع ذلك ، في بعض الحالات ، من الضروري تجاوز منشئ النسخ ، على سبيل المثال ، إذا كانت الفئة تحتوي على مؤشرات أو صفائف ديناميكية للبيانات.
في الختام ، فهم عندما يتم استدعاء منشئ نسخة في ج is هو جانب مهم من تطوير البرامج في هذه اللغة. يمكن أن يؤدي استخدام منشئ النسخ إلى تحسين كفاءة وأمن العمل مع الكائنات في ج++.
معلومات عامة حول منشئ النسخ
منشئ النسخ هو طريقة فئة خاصة يتم استخدامها لإنشاء كائن جديد مطابق لكائن موجود. يقوم بنسخ قيم جميع أعضاء الكائن الأصلي إلى الكائن الجديد.
يتم استدعاء منشئ النسخ في الحالات التالية:
- عند تهيئة كائن جديد مع كائن موجود من نفس الفئة.
- عند تمرير كائن كوسيطة إلى دالة (حسب القيمة) أو إرجاع كائن من دالة (حسب القيمة).
- عند إنشاء نسخة من كائن داخل عمليات أخرى ، مثل تعيين كائنات أو التهيئة بقائمة تهيئة في المنشئ.
منشئ النسخ لديه التوقيع التالي:
| اسم الصف | (كونست كلاس_اسم & آخر ) |
هنا ، اسم_الطبقة هو اسم الفئة التي يتم تعريف منشئ نسخة ، والآخر هو إشارة إلى كائن من نفس الفئة التي سيتم نسخها. لاحظ أن المعلمة يجب أن تكون مرجعا ثابتا لمنع تعديل الكائن الأصلي.
يمكن إنشاء منشئ النسخ تلقائيا بواسطة المترجم إذا لم يتم تعريفه من قبل المستخدم.
يمكن أن يكون استخدام منشئ النسخ مفيدا عندما يحتوي كائن على ذاكرة مخصصة ديناميكيا أو موارد أخرى تحتاج إلى نسخها بشكل صحيح لكائن جديد.
استدعاء منشئ النسخ عند إنشاء كائنات
يتم استدعاء منشئ النسخ في ج when عند إنشاء كائن جديد بناء على كائن موجود. يتم استخدامه لتهيئة كائن جديد بقيم مشتقة من كائن موجود.
يتم استدعاء منشئ النسخ في الحالات التالية:
- عند إنشاء كائن جديد استنادا إلى كائن موجود بالفعل أثناء التهيئة:
- ميكلاس أوبج;
| نموذج التعليمات البرمجية | التعليق |
|---|---|
| ميكلاس أوبج2 (أوبج1); |
| استدعاء منشئ النسخ عند إرجاع قيمة الكائن من الوظيفة. | يتم تمرير معلمة الوظيفة حسب القيمة: |
نموذج التعليمات البرمجية
التعليق
فواد فونك (ميكلاس أوبج) {
// رمز الوظيفة
}
استدعاء منشئ النسخ عند تمرير كائن كائن كمعلمة دالة.
يمكن تعريف منشئ النسخ بشكل صريح من قبل المستخدم أو إنشاؤه تلقائيا بواسطة المترجم إذا لم يتم تعريفه صراحة. إذا لم يكن هناك منشئ نسخ محدد صراحة في الفصل ، فسيقوم المترجم بإنشائه تلقائيا.
من المهم ملاحظة أن منشئ النسخ ينسخ قيم جميع أعضاء الفصل ، بما في ذلك المتغيرات والمؤشرات والمصفوفات الديناميكية. يؤدي هذا إلى إنشاء نسخة مستقلة من الكائن ، وليس مجرد نسخة من المؤشر.
يمكن أن يكون استخدام منشئ النسخ مفيدا في العديد من المواقف ، خاصة عند العمل مع الفئات التي تحتوي على بيانات ديناميكية.
استدعاء منشئ النسخ عند تمرير الكائنات إلى الوظائف والأساليب
يتم استدعاء منشئ النسخ في ج when عند تمرير الكائنات إلى الوظائف والأساليب. عندما يتم تمرير كائن حسب القيمة كوسيطة ، يقوم المترجم بإنشاء نسخة مؤقتة من الكائن باستخدام منشئ النسخ.
عند استدعاء دالة أو طريقة بتمرير كائن حسب القيمة ، يتم إنشاء كائن جديد ، ويتم نسخ قيم أعضائه من الكائن الذي تم تمريره. بعد تنفيذ الوظيفة ، يتم تدمير الكائنات المؤقتة ، ويظل الكائن المنقول دون تغيير.
يوضح المثال التالي استدعاء منشئ النسخ عند تمرير الكائنات إلى دالة:
فئة ميكلاس {
قيمة كثافة العمليات;
العامة:
ميكلاس (إنت الخامس): القيمة (الخامس) {}
إنت جيتفالو () { قيمة الإرجاع؛}
};
فواد برينتفالو (ميكلاس أوبج) {
كوت < < "القيمة:" < < أوبج.جيتفالو () < < إندل;
}
كثافة العمليات الرئيسية () {
ميكلاس أوبج (5);
برينتفالو (أوبج);
العودة 0;
}
في المثال أعلاه ، تحتوي فئة ميكلاس على منشئ نسخ افتراضي. عند استدعاء دالة برينتفالو ، يتم تمرير كائن أوبج حسب القيمة ويتم إنشاء نسخة مؤقتة من كائن أوبج باستخدام منشئ النسخ.
قيمة الكائن الذي تم تمريره هو الإخراج داخل وظيفة برينتفالو. نتيجة للإخراج ، سيتم عرض ما يلي:
القيمة: 5
يتم استدعاء منشئ النسخ أيضا عند تمرير الكائنات إلى طرق الفصل. النظر في المثال التالي:
فئة ميكلاس {
قيمة كثافة العمليات;
العامة:
ميكلاس (إنت الخامس): القيمة (الخامس) {}
- إنت جيتفالو () { قيمة الإرجاع؛}
- فواد برينتفالو () {
- كوت < < "القيمة:" < < قيمة < < إندل;
}
};
كثافة العمليات الرئيسية () {
ميكلاس أوبج (5);
كائن.برينتفالو();
العودة 0;
}
في هذا المثال ، طريقة برينتفالو من فئة ميكلاس لا يقبل الحجج ، ومع ذلك ، فإنه يسمى على كائن أوبج. عند استدعاء الأسلوب ، يتم تمرير الكائن أوبج ضمنا كما المتصل.
يتم إخراج قيمة عضو كائن القيمة داخل طريقة برينتفالو. نتيجة للإخراج ، سيتم عرض ما يلي:
القيمة: 5
في كلتا الحالتين ، عند تمرير الكائنات إلى الوظائف والأساليب ، سيتم استدعاء منشئ النسخ إذا تم تعريفه أو إنشاؤه بواسطة المترجم الافتراضي.
استدعاء منشئ النسخ عند إرجاع الكائنات من الوظائف والأساليب
في ج++ ، يتم استدعاء منشئ النسخ تلقائيا في مواقف معينة ، بما في ذلك إرجاع الكائنات من الوظائف والأساليب.
عندما تقوم دالة أو طريقة بإرجاع كائن ، من الضروري إنشاء نسخة منه لتمريره إلى رمز الاتصال وحفظ الكائن الأصلي داخل هذه الوظيفة أو الطريقة.
يمكن تفسير عملية استدعاء منشئ النسخ عند إرجاع الكائنات من الوظائف والأساليب على النحو التالي:
قبل أن تقوم وظيفة أو طريقة بإرجاع كائن ، يتم إنشاء كائن جديد ، والذي سيكون نسخة من الكائن الأصلي.
يتم نسخ الكائن الأصلي إلى الكائن الجديد باستخدام منشئ النسخ.
يتم إرجاع الكائن الجديد إلى رمز الاتصال.
مثال على استخدام منشئ النسخ عند إرجاع كائن من دالة:
فئة ميكلاس {
العامة:
ميكلاس () {//منشئ الافتراضي
// تهيئة الكائن
}
ميكلاس (كونست ميكلاس وغيرها) {//نسخة منشئ
// نسخ البيانات من الآخرين إلى هذا
}
};
ميكلاس كريتوبجيكت () {
/ / إنشاء الكائن
// تهيئة الكائن
| } | كثافة العمليات الرئيسية () { |
|---|---|
| ميكلاس ميوبج = كريتوبجيكت () ؛ / / استدعاء منشئ نسخة | // باستخدام نسخة من الكائن |
| العودة 0; | } |
في هذا المثال ، تقوم الدالة كريتيوبجيكت () بإنشاء كائن كائن من نوع ميكلاس وإعادته. عند تعيين قيمة الإرجاع لوظيفة كريتيوبجيكت () إلى متغير ميوبج ، يتم استدعاء منشئ النسخ ، مما يؤدي إلى إنشاء نسخة من كائن أوبج. وبالتالي ، يحتوي متغير ميوبج على نسخة من الكائن الأصلي.
وبالمثل ، عند إرجاع كائن من الطريقة ، سيتم أيضا استدعاء منشئ النسخ. تتيح لك هذه الآلية نقل الكائنات بسهولة بين الوظائف والأساليب دون الحاجة إلى نسخ جميع أعضاء الكائن بشكل صريح.
أمثلة على استخدام منشئ النسخ في المواقف الحقيقية
منشئ نسخة في ج is أداة هامة لإنشاء نسخة من كائن. يمكن استخدامه في مواقف مختلفة حيث تحتاج إلى إنشاء كائن جديد مطابق لكائن موجود. فيما يلي بعض الأمثلة على استخدام منشئ النسخ:
- تمرير كائن كوسيطة إلى وظيفة:
- يمكن استخدام منشئ النسخ لتمرير كائن كوسيطة إلى دالة. على سبيل المثال ، إذا كان لديك فصل طالب وتريد إنشاء دالة تأخذ الطالب كوسيطة ، فيمكنك استخدام منشئ النسخ لنسخ بيانات الطالب إلى كائن جديد وتمريره إلى الوظيفة.
- إرجاع كائن من دالة:
- يمكن أيضا استخدام منشئ النسخ لإرجاع كائن من دالة. إذا كانت لديك وظيفة تقوم بإنشاء وتعديل كائن ثم تحتاج إلى إعادته ، فيمكنك استخدام منشئ النسخ لإنشاء نسخة من الكائن المعدل وإعادته من الوظيفة.
- إنشاء نسخة مستقلة من كائن:
في بعض الحالات ، قد تحتاج إلى إنشاء نسخة مستقلة من كائن حتى لا تؤثر التغييرات التي تم إجراؤها على كائن ما على كائن آخر. يتيح لك منشئ النسخ إنشاء نسخة من كائن ، بما في ذلك جميع بياناته ، وهو أمر مفيد في مثل هذه الحالات.
من المهم أن نفهم أن منشئ النسخ يتم استدعاؤه تلقائيا في بعض الحالات ، على سبيل المثال ، عند تمرير كائن حسب القيمة أو عند تهيئة كائن بآخر. ومع ذلك ، في بعض الحالات ، قد تحتاج إلى استدعاء منشئ النسخ بشكل صريح لإنشاء نسخة من الكائن.
بناء الجملة لاستدعاء منشئ النسخ
طريقة الاتصال
مثال
مكالمة تلقائية
الطالب س1 = س2;
تحد صريح
الطالب 3 (2);
في كلتا الحالتين ، سيتم استدعاء منشئ النسخ وإنشاء نسخة من س2 كائن.
ملامح منشئ نسخة وتنفيذها
منشئ النسخ في ج is هي طريقة فئة خاصة يتم استخدامها لإنشاء كائن جديد تمت تهيئته بقيم كائن موجود من نفس الفئة. يتم استدعاؤه أثناء نسخ الكائن ، على سبيل المثال ، عند تمرير كائن كمعلمة حسب القيمة ، أو العودة من دالة حسب القيمة ، أو عند تعيين الكائنات.
الملامح الرئيسية لمنشئ النسخ:
عادة ما يتم الإعلان عن منشئ النسخ كطريقة عامة للفئة.
فإنه يأخذ كمعلمة إشارة إلى كائن من نفس الفئة.
إذا لم يتم تعريف منشئ النسخ بشكل صريح ، فسيقوم مترجم سي compiler بإنشائه تلقائيا.
لا يمكن اعتراض الاستثناءات التي تحدث أثناء نسخ الكائن داخل منشئ النسخ.
إذا كانت الفئة تحتوي على ذاكرة مخصصة ديناميكيا ، فمن الضروري ضمان النسخ العميق عن طريق تنفيذ منشئ النسخ.
يعتمد تنفيذ منشئ النسخ على بنية الفئة ومتطلبات التطبيق. هنا مثال على التنفيذ المشترك:
فئة ميكلاس {
خاص:
كثافة العمليات * البيانات;
حجم كثافة العمليات;
العامة:
ميكلاس (كونست ميكلاس وغيرها) {
// تخصيص الذاكرة للبيانات
حجم = أخرى.الحجم;
البيانات = كثافة العمليات الجديدة [الحجم];
// نسخ البيانات من كائن آخر
ل (إنت أنا = 0 ؛ أنا < الحجم ؛ i أنا) {
البيانات [أنا] = آخر.البيانات [ط];
}