تمثيل الغياب باستخدام optional
تجنّب المؤشرات الفارغة
تمثيل الغياب باستخدام optional درس مجاني في C++ Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C++ Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C++ Academy 4 دروس في المجموع.
مشكلة القيمة الفارغة
إن إرجاع قيمة مميِّزة مثل -1 أو مؤشر null للدلالة على «عدم وجود قيمة» أمر هشّ وسهل إساءة استخدامه. يمثّل std::optional<T> بوضوح «قيمة أو لا شيء». أدرجوا <optional>.
#include <iostream>
#include <optional>
int main() {
std::optional<int> maybe = 42;
std::cout << *maybe << "\n";
}Optional فارغ
يؤدي إنشاء optional افتراضيًا، أو إسناد std::nullopt إليه، إلى Optional فارغ لا يحتوي على أي قيمة.
#include <iostream>
#include <optional>
int main() {
std::optional<int> empty;
std::optional<int> also = std::nullopt;
std::cout << empty.has_value() << " " << also.has_value() << "\n";
}التحقق من وجود قيمة
استدعوا has_value() أو استخدموا optional مباشرةً في سياق منطقي لاختبار ما إذا كان يحتوي على قيمة.
#include <iostream>
#include <optional>
int main() {
std::optional<int> o = 5;
if (o) std::cout << "has value\n";
if (o.has_value()) std::cout << "yes\n";
}استخدام Optional كنوع إرجاع
تُعد الدوال التي قد تفشل في إنتاج نتيجة مناسبة جدًا لهذا الاستخدام. أعيدوا القيمة عند النجاح، وstd::nullopt عند الفشل.
#include <iostream>
#include <optional>
std::optional<int> half(int n) {
if (n % 2 == 0) return n / 2;
return std::nullopt;
}
int main() {
auto r = half(10);
if (r) std::cout << *r << "\n";
}قراءة القيمة
استخدموا *opt أو opt.value() بعد التأكد من احتوائه على قيمة. إن إلغاء الإشارة إلى optional فارغ باستخدام * هو سلوك غير معرّف.
#include <iostream>
#include <optional>
int main() {
std::optional<std::string_view> name = "Ada";
if (name) std::cout << *name << "\n";
}تواقيع توضّح نفسها
يوضح نوع الإرجاع std::optional للمستدعي، بمجرد النظر، أن الدالة قد لا تنتج نتيجة؛ ولا حاجة إلى تعليقات.
#include <iostream>
#include <optional>
#include <string>
std::optional<std::string> getEnvName(bool present) {
if (present) return std::string("CONFIG");
return std::nullopt;
}
int main() { std::cout << getEnvName(true).has_value() << "\n"; }إعادة ضبط Optional
استدعوا reset() لجعل optional فارغًا مرة أخرى، أو أسندوا إليه std::nullopt.
#include <iostream>
#include <optional>
int main() {
std::optional<int> o = 99;
o.reset();
std::cout << o.has_value() << "\n"; // 0
}الإنشاء في المكان
تنشئ emplace القيمة المحتواة مباشرةً داخل optional، مما يتجنب عملية نسخ إضافية.
#include <iostream>
#include <optional>
#include <string>
int main() {
std::optional<std::string> o;
o.emplace("built in place");
std::cout << *o << "\n";
}Optional أم مؤشر
قد يكون المؤشر الخام null، لكنه لا يوضح شيئًا عن الملكية، كما أنه يعرّضكم لخطر المؤشرات المعلّقة. أما optional فيمتلك قيمته مباشرةً، ويشير بوضوح إلى «احتمال الغياب» دون تخصيص في heap.
Optional من المراجع؟
يخزّن std::optional القيم لا المراجع. وللإشارة اختياريًا إلى كائن موجود، خزّنوا مؤشرًا أو استخدموا std::optional<std::reference_wrapper<T>>.
متى نستخدم Optional
استخدموه في عمليات البحث التي قد لا تنجح، أو التحليل الذي قد يفشل، أو الإعدادات التي قد لا تكون محددة. يغطّي الدرس التالي الطرق الآمنة للوصول إلى القيمة المحتواة.
تحقق سريع
تحقّقوا من فهمكم لـ std::optional.
مراجعة
تعلّمتم أساسيات std::optional:
- يمثّل «قيمة أو لا شيء» دون قيم مميِّزة أو null.
- يكون فارغًا عند الإنشاء الافتراضي أو باستخدام
std::nullopt. - يمكن التحقق منه باستخدام
has_value()أو اختبار منطقي. - يُعد نوع إرجاع مثاليًا لعمليات البحث القابلة للفشل.
الأسئلة الشائعة
هل درس «تمثيل الغياب باستخدام optional» مجاني؟
نعم — نص درس «تمثيل الغياب باستخدام optional» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C++ Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C++ Academy 4 دروس في المجموع.
ماذا ستتعلم في «تمثيل الغياب باستخدام optional»؟
تجنّب المؤشرات الفارغة تتمرن على C++ Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ C++ Academy؟
لا تُشترط خبرة سابقة. C++ Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.
كم من الوقت يستغرق درس «تمثيل الغياب باستخدام optional»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس C++ Academy هذا؟
نعم. كل درس في C++ Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- تمثيل الغياب باستخدام optional
- الوصول إلى قيم optional
- أساسيات std::expected
- أنماط معالجة الأخطاء