منشئات النقل وإسناد النقل
نفّذ منشئات النقل ومعاملات إسناد النقل على نحو صحيح.
منشئات النقل وإسناد النقل درس مجاني في C++ Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C++ Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C++ Academy 4 دروس في المجموع.
عضوان خاصان
يتيح مُنشئ النقل وعامل إسناد النقل لفئتك الاستيلاء على موارد مثيل آخر دون نسخها.
التوقيع
يقبل كلاهما مرجع rvalue من النوع نفسه.
class String {
public:
String(String&& other) noexcept; // move ctor
String& operator=(String&& other) noexcept; // move assign
};تنفيذ مُنشئ النقل
استولِ على موارد المصدر واتركه في حالة صالحة وفارغة.
String(String&& other) noexcept
: data_(other.data_), size_(other.size_) {
other.data_ = nullptr;
other.size_ = 0;
}تنفيذ إسناد النقل
ثلاث خطوات: حرّر الموارد الحالية، واستولِ على موارد المصدر، واترك المصدر فارغًا.
String& operator=(String&& other) noexcept {
if (this != &other) {
delete[] data_;
data_ = other.data_;
size_ = other.size_;
other.data_ = nullptr;
other.size_ = 0;
}
return *this;
}لماذا يهم noexcept؟
ضع وسم noexcept على عمليات النقل كلما أمكن. فالحاويات القياسية مثل std::vector لا تستخدم النقل عند تغيير الحجم إلا إذا كان noexcept؛ وإلا فإنها تعود إلى النسخ من أجل أمان الاستثناءات.
قاعدة الخمسة
إذا كتبت أيًّا من هذه الأعضاء الخمسة، ففكّر فيها كلها:
- المُدمّر
- مُنشئ النسخ
- إسناد النسخ
- مُنشئ النقل
- إسناد النقل
قاعدة الصفر
والأفضل من ذلك — ألّا تكتب أيًّا منها. خزّن الأعضاء بصفتها أنواع RAII (مثل المتجهات والسلاسل والمؤشرات الذكية). تعمل القيم الافتراضية التي ينشئها المصرّف بصورة صحيحة وفعّالة.
class Widget {
std::string name_;
std::vector<int> data_;
// No need for destructor, copy, or move — compiler does the right thing
};متى يُنشئ المصرّف دوال النقل
ينشئ المصرّف أعضاء النقل الافتراضية فقط عندما:
- لا يوجد مُنشئ نسخ أو معامل إسناد نسخ أو مُدمّر أو أعضاء نقل مصرّح بها من قِبلكم
- تكون جميع الأعضاء والقواعد قابلة للنقل بدورها
النقل الافتراضي والمحذوف
يمكنكم طلب دوال النقل التي ينشئها المصرّف أو منعها بشكل صريح.
class Widget {
public:
Widget(Widget&&) = default;
Widget& operator=(Widget&&) = default;
// or
Widget(Widget&&) = delete;
};بعد النقل
يكون الكائن الذي نُقلت موارده في حالة صالحة، لكن غير محددة. يمكنكم:
- إتلافه
- إسناد قيمة جديدة إليه
- استدعاء أي عملية ليس لها شرط مسبق (size() وempty() وclear())
حالات الاستخدام
تُسرّع دلالات النقل ما يلي:
- إرجاع الكائنات الكبيرة (عندما لا يُطبَّق RVO)
- وضع الكائنات الكبيرة في الحاويات (باستخدام push_back مع قيم rvalue)
- تنفيذ أنواعكم الخاصة التي تملك موارد
تحقق سريع
لماذا ينبغي وسم مُنشئات النقل ومعاملات إسناد النقل بالعبارة noexcept؟
مراجعة
تستولي مُنشئات النقل ومعاملات إسناد النقل على الموارد من قيمة rvalue وشيكة الانتهاء. وسموها بالعبارة noexcept لتسريع الحاويات. اتبعوا قاعدة الخمسة، أو الأفضل منها قاعدة الصفر، عبر تركيب أنواع RAII القياسية.
الأسئلة الشائعة
هل درس «منشئات النقل وإسناد النقل» مجاني؟
نعم — نص درس «منشئات النقل وإسناد النقل» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C++ Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C++ Academy 4 دروس في المجموع.
ماذا ستتعلم في «منشئات النقل وإسناد النقل»؟
نفّذ منشئات النقل ومعاملات إسناد النقل على نحو صحيح. تتمرن على C++ Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ C++ Academy؟
لا تُشترط خبرة سابقة. C++ Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «منشئات النقل وإسناد النقل»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس C++ Academy هذا؟
نعم. كل درس في C++ Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- Lvalue مقابل Rvalue: التمييز بينهما
- مراجع Rvalue وصياغة &&
- std::move وstd::forward
- منشئات النقل وإسناد النقل