C++ نقل المنشئ

C Nql Almnshy



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

في برمجة C++، تم تقديم مُنشئات 'التحريك' لتقليل الازدواجية وتعزيز الكفاءة. يلعب دورًا حاسمًا في تحسين الأداء عن طريق تقليل عمليات النسخ. يستكشف هذا الدليل بعمق مُنشئ 'النقل' في برمجة C++.







مثال 1:

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



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



بعد ذلك، نقوم بنسخ تعريف المنشئ وتهيئة 'my_str' إلى 'my_obj.my_str'. أسفل هذا، نطبع سطرًا ثم نضع تعريف مُنشئ 'النقل'. هنا، نقوم بتهيئة 'my_str' مرة أخرى باستخدام 'my_obj.my_str'. نحن لا نضيف أي بيان أدناه؛ إنه فارغ. بعد ذلك، نعلن عن دالة تسمى 'displayMyObject()' من نوع السلسلة ونستخدم 'return str' حتى تقوم بإرجاع السلسلة.





نضع الدالة 'new_temp' العامة في النوع 'نقل'. أسفله، لدينا 'درجة حرارة الإرجاع' التي تُرجع كائن نوع النقل. الآن، نضع رمز التشغيل 'main()' و'new_obj1' من النوع 'move' ونحصل على المُنشئ 'move' من 'rvalue'. في السطر التالي، نضع 'new_obj1.displayMyObject()' للحصول على مُنشئ 'النقل' من 'lvalue'. بعد ذلك، نسمي المُنشئ 'move' بالكائن 'my_obj1'. ثم نقوم بنقل ملكية 'my_obj1' إلى الكائن الآخر وهو 'my_obj2'.

الكود 1:

#تشمل

#تشمل <سلسلة>

استخدام مساحة الاسم الأمراض المنقولة جنسيا ;

فصل يتحرك

{

خاص :
سلسلة my_str ;
عام :
يتحرك ( ) : my_str ( 'هذه هي السلسلة الافتراضية هنا' )
{
}
يتحرك ( مقدار ثابت يتحرك & my_obj ) : my_str ( my_obj. my_str )
{


cout << 'تم استدعاء مُنشئ النسخ، فشل النقل! ' ;

}
يتحرك ( يتحرك && my_obj ) : my_str ( يتحرك ( my_obj. my_str ) )
{
}
عرض السلسلةMyObject ( )
{
يعود my_str ;
}
} ;
نقل new_temp ( تحرك تمب )
{
يعود com.tmp ;
}
كثافة العمليات رئيسي ( )
{
نقل new_obj1 = new_temp ( يتحرك ( ) ) ;


cout << 'قبل نقل () الاتصال: new_obj1 = ' << new_obj1. this.displayMyObject ( ) << endl ;

نقل new_obj2 = يتحرك ( new_obj1 ) ;

cout << 'بعد استدعاء منشئ النقل (): new_obj1 = ' << new_obj1. this.displayMyObject ( ) << endl ;

cout << 'بعد استدعاء منشئ النقل (): new_obj2 = ' << new_obj2. this.displayMyObject ( ) << endl ;

يعود 0 ;

}

انتاج:

يُظهر الإخراج أنه قبل استدعاء الأسلوب 'move()'، فإن 'new_obj1' يحتوي على السلسلة الافتراضية. ولكن بعد استدعاء أسلوب move() للفئة 'Move'، يحتوي 'my_obj1' على سلسلة فارغة و'my_obj2' يحتوي على السلسلة الافتراضية.



مثال 2:

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

بعد ذلك، نعلن عن الكائنات في الكومة. نقوم بتهيئة 'القيمة' بـ 'new int' و'*value' بـ 'v1'. ثم ضع 'cout' حيث نضيف سطرًا يُطبع عندما نقوم بتنفيذ الكود. أدناه، نستخدم منشئ 'النسخة'. يقوم منشئ 'النسخ' هذا بنسخ البيانات عن طريق عمل نسخة عميقة. نضع المُنشئ 'Move' ونمرر 'Move&& new_source' كمعلمة له. ونضع تحتها علامة 'cout' التي تساعد في ظهور البيان المطلوب.

نقوم بإدراج الكلمة الأساسية 'nullptr' لتحديد ما إذا كان المؤشر فارغًا قبل استخدام المرجع. الآن، نقوم أيضًا بوضع أداة التدمير '~Move()' التي نضع فيها شرط 'if' الذي يتحقق مما إذا كانت 'القيمة' لا تساوي 'nullptr'. عند التحقق من هذا الشرط، يتم تنفيذ البيان أدناه. إذا لم يتم التحقق من هذا الشرط، فإنه يتخطى عبارة 'cout' الموجودة بعد شرط 'if' ويتحرك نحو الجزء 'آخر'.

بعد ذلك، نستخدم الكلمة الأساسية 'delete' التي تساعد في إلغاء تخصيص كائن أو يمكننا القول أنها تحرر الذاكرة المخصصة لمكون بيانات الكائن. الآن، نقوم باستدعاء الطريقة 'main()' هنا وننشئ المتجه لفئة 'Move' الخاصة بنا بالاسم 'my_vec'. بعد ذلك، نستخدم وظيفة 'push_back()' التي تساعد على إدراج قيمة عند نقطة نهاية المتجه. يحتوي ملف الرأس 'المتجه' على هذه الوظيفة. أولاً، نقوم بإدخال '39' في المتجه. ثم يتم إدراج '57' وإدراج '91' أيضًا باستخدام طريقة 'push_back()'.

الكود 2:

#تشمل

#تشمل <ناقل>

استخدام مساحة الاسم الأمراض المنقولة جنسيا ;

فصل يتحرك {

خاص :
كثافة العمليات * قيمة ;
عام :
يتحرك ( كثافة العمليات الإصدار 1 )
{
قيمة = جديد كثافة العمليات ;
* قيمة = الإصدار 1 ;

cout << 'تم استدعاء المنشئ ل'

<< الإصدار 1 << endl ;

} ;
يتحرك ( مقدار ثابت يتحرك & مصدر جديد )
: يتحرك { * مصدر جديد. قيمة }
{


cout << 'يتم استدعاء مُنشئ النسخ -'

<< 'نسخة عميقة ل'

<< * مصدر جديد. قيمة

<< endl ;

}
يتحرك ( يتحرك && مصدر جديد )
: قيمة { مصدر جديد. قيمة }
{


cout << 'نقل المنشئ لـ'

<< * مصدر جديد. قيمة << endl ;

مصدر جديد. قيمة = nullptr ;

}
~تحرك ( )
{
لو ( قيمة ! = nullptr )


cout << 'تم استدعاء المدمر'

<< * قيمة << endl ;

آخر

cout << 'يتم استدعاء المدمر'

<< 'لـ nullptr'

<< endl ;

يمسح قيمة ;

}

} ;

كثافة العمليات رئيسي ( )

{

المتجه < يتحرك > شيء يخصني ;

شيء يخصني. إدفع إلى الخلف ( يتحرك { 39 } ) ;
شيء يخصني. إدفع إلى الخلف ( يتحرك { 57 } ) ;
شيء يخصني. إدفع إلى الخلف ( يتحرك { 91 } ) ;
يعود 0 ;


}

انتاج:

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

خاتمة

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