وثائق C++
مرجع موجز ومدعّم بأمثلة للغة C++. اقرأ المفهوم، شاهد الكود، ثم تدرّب عليه في رحلة Coddy.
ابدأ رحلة موجَّهة في C++البداية
- ما هي C++ما هي C++ في حقيقتها، ولماذا تُترجَم مباشرةً إلى كود الآلة الأصلي، وأنواع البرمجيات عالية الأداء التي تُبنى بها.
- تثبيت ++Cكيفية تثبيت مُترجِم ++C (سواء GCC أو Clang أو MSVC)، واختيار سلسلة الأدوات المناسبة لنظام تشغيلك، والتأكد من أنها تعمل من سطر الأوامر.
- تصريف ++Cكيف يحوّل ++C ملف المصدر .cpp إلى ملف تنفيذي أصلي: صرّف باستخدام g++ (أو clang++/MSVC)، وشغّل الملف الثنائي، واقرأ أخطاء المصرّف عندما يحدث خلل.
- صياغة C++قواعد الصياغة الأساسية لبرنامج C++ - الجُمل والفاصلة المنقوطة، وكتل الأقواس المعقوفة، ودالة main، وكيف يعمل الإخراج - مشروحة انطلاقًا من برنامج أول.
- التعليقاتكيفية كتابة التعليقات في C++ - ملاحظات السطر الواحد // وكتل الأسطر المتعددة /* */ - بالإضافة إلى كيفية تعطيل الكود بالتعليق، ولماذا لا تتداخل التعليقات الكتلية، وما الذي يجعل التعليق جديرًا بالإبقاء عليه.
المتغيرات والأنواع
- المتغيّراتكيف تعمل المتغيّرات في C++ - الإعلان عنها بنوع، الفرق بين الإسناد والتهيئة، التهيئة بالأقواس المعقوفة، قواعد التسمية، والنطاق الذي يحدّد أين يعيش المتغيّر ومتى يزول.
- أنواع البياناتجولة عملية في أنواع البيانات الأساسية في C++ - الأعداد الصحيحة والفاصلة العائمة وchar وbool - بالإضافة إلى الأحجام، وsigned مقابل unsigned، والقيم الحرفية واللواحق، والفيض، وكيفية اختيار النوع المناسب.
- الكلمة المفتاحية autoكيف تتيح الكلمة المفتاحية `auto` للمترجم استنتاج نوع المتغير نيابةً عنك - ما الذي تُسقطه، وأين تتألق، والمطبّات التي توقع المبتدئين.
- الثوابت و constكيفية التصريح عن قيم للقراءة فقط في C++ باستخدام const، والفرق بين const و constexpr، والمؤشرات الثابتة مقابل المؤشرات إلى ثابت، ودوال الأعضاء الثابتة.
- المعاملاتتعلّم معاملات C++ - الحسابية والمقارنة والمنطقية والإسناد والمعاملات على مستوى البتات - إضافة إلى المزالق المتعلقة بالقسمة الصحيحة والأسبقية والتقييم القصير.
- تحويل الأنواعكيف يعمل تحويل الأنواع في C++ - التحويلات الضمنية، وفخّ القسمة الصحيحة، والتحويلات الأربعة المسمّاة (static_cast وconst_cast وreinterpret_cast وdynamic_cast) - مع المزالق التي تسبب فقدانًا صامتًا للبيانات.
التحكم في التدفق
- if-elseكيف تتخذ القرارات في ++C باستخدام if وelse if وelse: الشروط، وتسلسل الفروع، والتداخل، والمعامل الثلاثي، وعبارة if مع المُهيِّئ، والمزالق التي يقع فيها كثيرون.
- switchشرح جملة switch في ++C: تسميات case، وbreak والانسياب (fall-through)، وفرع default، وتجميع الحالات، وswitch على enum، والمزالق المتعلقة بالتصريحات داخل الحالات.
- حلقة forكيفية تكرار الشيفرة باستخدام حلقة for في C++ - الترويسة المكوّنة من ثلاثة أجزاء، العدّ تصاعديًا وتنازليًا، المرور على المصفوفات، التداخل، break وcontinue، وأخطاء الانزياح بمقدار واحد والأنواع غير الموقّعة التي تطال الجميع.
- حلقات whileشرح حلقة while في C++: حلقة while التي تفحص الشرط أولًا، وحلقة do-while التي تُنفَّذ مرة واحدة على الأقل، والتكرار حتى قيمة حارسة، وbreak وcontinue، وكيفية تجنّب الحلقات اللانهائية.
- for المعتمدة على النطاقشرح حلقة for المعتمدة على النطاق في C++ - تكرار نظيف على المصفوفات وvector وstring وmap، ولماذا ينبغي استخدام auto& وconst auto&، ومزالق النسخ وإبطال المُكرِّرات التي يجب تجنبها.
الدوال
- الدوالكيف تكتب الدوال في C++ — بنية نوع الإرجاع/الاسم/المعاملات، الفرق بين الإعلان والتعريف، إرجاع القيم، الدوال من نوع void، والأخطاء الشائعة مثل نسيان return أو نسيان النموذج الأولي.
- معاملات الدوالكيف تصل الوسائط إلى دوال ++C - التمرير بالقيمة مقابل التمرير بالمرجع، ومراجع const للوصول الرخيص للقراءة فقط، والوسائط الافتراضية، والمؤشرات، ومزالق تكلفة النسخ التي تُبطئ البرامج بصمت.
- المراجعشرح المراجع في C++: كيف يُنشئ الرمز & في المعامل اسماً بديلاً، ولماذا يتجنب التمرير بالمرجع النسخ ويتيح للدالة تعديل متغيرات المُستدعي، ومتى تلجأ إلى const& والمراجع بدلاً من إرجاع القيم.
- التحميل الزائد للدواليتيح التحميل الزائد للدوال في C++ لعدة دوال أن تتشارك اسمًا واحدًا طالما اختلفت قوائم معاملاتها. تعلّم كيف يختار حلّ التحميل الزائد التطابق المناسب، ولماذا لا يكفي نوع القيمة المعادة وحده، وما فخاخ الغموض والوسائط الافتراضية التي يجب تجنّبها.
- دوال لامدااكتب دوالًا صغيرة مضمَّنة في الحال باستخدام دوال لامدا في ++C - الصياغة، وكيف يعمل الالتقاط، ومتى تستخدم `mutable`، وفخّ الالتقاط المعلَّق الذي يقع فيه الجميع.
المؤشرات والذاكرة
- المؤشراتشرح المؤشرات في C++ من الصفر: تعريف مؤشر، عاملا & (عنوان) و* (إلغاء المرجعية)، وnullptr، والمؤشرات إلى المصفوفات، ومزالق المؤشرات المعلّقة وغير المهيّأة التي تسبّب الانهيارات.
- المراجع مقابل المؤشراتمقارنة عملية بين المراجع والمؤشرات في C++: ما الذي تشترك فيه، وأين تختلف (إعادة الربط، القيمة الفارغة، الحساب)، وقاعدة واضحة لاختيار أيهما في الكود اليومي.
- الذاكرة الديناميكيةكيف تحجز الذاكرة أثناء التشغيل باستخدام `new`، وتحررها باستخدام `delete`، وتتجنب التسريبات والمؤشرات المعلّقة والتحرير المزدوج التي ترافق إدارة الكومة يدويًا.
- المؤشرات الذكيةتمتلك المؤشرات الذكية ذاكرة الكومة (heap) وتحررها تلقائيًا. تعلّم `unique_ptr` و `shared_ptr` و `make_unique` و `make_shared`، ولماذا يجب أن تتوقف تقريبًا تمامًا عن كتابة `new`/`delete` من جديد.
السلاسل النصية والإدخال/الإخراج
- السلاسل النصيةكيفية استخدام `std::string` في C++ - بناء النص ودمجه والبحث فيه وتقطيعه بأمان، ولماذا نادرًا ما تحتاج إلى `char*` خام في العمل الحقيقي.
- الإدخال والإخراجكيف يعمل الإدخال والإخراج عبر الطرفية في C++: الطباعة باستخدام cout، والقراءة باستخدام cin، وخطأ سطر جديد الشهير في getline بعد cin، وكيفية التعافي عندما يفشل الإدخال.
- تدفقات السلاسل النصيةكيفية استخدام std::stringstream و istringstream و ostringstream لتحليل النص، وتقسيم السلاسل النصية حسب المسافات، والتحويل بين السلاسل النصية والأرقام، وبناء سلاسل نصية منسّقة في الذاكرة.
حاويات STL
- المصفوفاتشرح المصفوفات الخام في C++: كيفية تعريفها وتهيئتها، والفهرسة بأمان، والمرور عليها باستخدام حجمها، وفخّ تحلّل المصفوفة إلى مؤشر، ولماذا يتفوّق عليها عادةً std::array وvector.
- vectorstd::vector هو مصفوفة ++C القابلة لتغيير الحجم - الحاوية التي ينبغي اللجوء إليها افتراضيًا. تعلّم كيف تنشئ vector وتصل إلى عناصره وتوسّعه وتمر عليه، إضافةً إلى مزالق إبطال المُكرِّرات والوصول خارج الحدود.
- mapشرح std::map في C++ — حاوية مفتاح-قيمة مرتّبة حسب المفتاح مع بحث لوغاريتمي. تعلّم الإدراج والبحث والمرور على العناصر، وتجنّب فخّ operator[] الشهير الذي يدرج المفاتيح بصمت.
- unordered_mapتعلَّم std::unordered_map في C++ - شقيق map المعتمِد على جدول التجزئة الذي يمنحك إدراجًا وبحثًا بمتوسط O(1). يغطي العمليات الأساسية، ومأزق الإدراج التلقائي عبر []، والفرق بين count وfind، ومتى تختاره بدلًا من map المرتَّبة.
- setكيف يخزّن std::set قيمًا فريدة ومرتّبة تلقائيًا في C++: الإدراج، التحقق من العضوية باستخدام count و find، التكرار بالترتيب، والفروق بين set و multiset و unordered_set.
- pair وtupleكيف يجمع `std::pair` و`std::tuple` قيمتين أو أكثر في كائن واحد: كيفية إنشائهما، والوصول إلى الحقول، وstructured bindings، وأين يناسب كل منهما.
- المُكرِّراتكيف تعمل مُكرِّرات C++ كمؤشرات معمَّمة داخل الحاويات - begin() وend()، وفكّ الإسناد، والتقدّم، ومتغيّرات const/reverse، إضافة إلى مزالق الإبطال وفكّ إسناد end() التي تسبّب سلوكًا غير مُعرَّف.
خوارزميات STL والقوالب
- الخوارزمياتاستخدم خوارزميات C++ القياسية - `find` و`count_if` و`transform` و`accumulate` و`remove` - لإنجاز عمل حقيقي على النطاقات دون كتابة حلقات يدويًا، إلى جانب مزالق زوج المُكرِّرات ومصطلح erase-remove.
- الفرزافرز المتجهات والمصفوفات في C++ باستخدام `std::sort`: الترتيب الافتراضي، والمقارنات المخصصة، وفرز البُنى (structs) حسب حقل، وفخ الترتيب الضعيف الصارم الذي يسبب الانهيارات.
- القوالباكتب الكود مرة واحدة ودعه يعمل مع كل نوع باستخدام قوالب C++ - قوالب الدوال، وقوالب الأصناف، واستنتاج النوع، ورسائل أخطاء المُصرّف المُربكة التي تتسبب فيها.
الفئات والكائنات
- الأصنافتعرّف على كيفية جمع أصناف ++C للبيانات والسلوك في أنواع قابلة لإعادة الاستخدام: الإعلان عن المتغيرات الأعضاء والدوال، وإنشاء الكائنات، والفصل بين public/private، إضافة إلى المزالق مثل الأعضاء غير المهيأة ومؤشر this.
- البانيالباني هو دالة العضو الخاصة التي تُنفَّذ عند إنشاء كائن. تعرّف على الباني الافتراضي والباني ذي المعاملات وباني النسخ، وقوائم تهيئة الأعضاء، وكيف تتجنّب ترك الكائنات مهيّأة جزئيًا.
- المُدمِّراتيعمل المُدمِّر تلقائيًا عند إتلاف الكائن. تعرّف على صيغة `~ClassName()`، ومتى يُستدعى، ولماذا يحرّر الموارد، وقاعدة الثلاثة/الخمسة.
- الوراثةتعرّف على كيف تتيح الوراثة في C++ لصنف مشتق إعادة استخدام صنف أساسي وتوسيعه: الصياغة، الوراثة العامة مقابل الخاصة، ترتيب المُنشئات والمُدمّرات، والمزالق مثل تقطيع الكائنات (slicing).
- الدوال الافتراضيةتتيح الدوال الافتراضية لمؤشر الصنف الأساسي استدعاء نسخة الدالة الخاصة بالصنف المشتق أثناء التشغيل. تعلّم `virtual` و`override` والأصناف المجردة، ولماذا يجب أن يكون هادم الصنف الأساسي افتراضيًا.
- تحميل المعاملات الزائديتيح تحميل المعاملات الزائد في C++ لأنواعك الخاصة أن تعمل مع المعاملات المدمجة مثل + و == و <<. تعرّف على قواعد الدالة العضو مقابل الدالة غير العضو، وكيفية تحميل معاملات المقارنة ومعاملات التدفق، والمزالق المتعلقة بأنواع الإرجاع ومعامل الإسناد.
- محددات الوصولكيف تتحكم public وprivate وprotected في من يستطيع لمس أعضاء الصنف في C++ - أساس التغليف، مع الـ getters والـ setters ومنفذ الهروب friend.
- البُنىشرح البُنى (structs) في C++: كيف تجمّع المتغيرات المترابطة في نوع واحد، وتعلن عن كائنات البنية وتهيّئها، وتمنح البنية دوال أعضاء وبانيات، وكيف تختلف struct فعلياً عن class.
- التعداداتتعلّم تعدادات ++C: كيفية تعريفها، ولماذا يكون enum class ذو النطاق أكثر أمانًا من enum العادي، والقيم الأساسية المخصصة، واستخدام switch مع عناصر التعداد، والتحويل من الأعداد الصحيحة وإليها.
الأخطاء وتصحيحها
- الاستثناءاتتُبلِّغ الاستثناءات عن الأخطاء التي لا تستطيع الدالة معالجتها محليًا. تعلّم كيفية استخدام `throw`، وما هي أنواع الاستثناءات القياسية، ورسالة `what()`، ولماذا تتفوق الاستثناءات على رموز الإرجاع في حالات الفشل التي تهم فعلًا.
- try-catchلُف الكود المحفوف بالمخاطر داخل `try`، وتفاعل في `catch`. تعلّم كيف تلتقط الاستثناءات عبر مرجع ثابت، وترتّب عدة معالِجات، وتستخدم `catch (...)`، وتعيد الإطلاق، دون تسريب الموارد.
- السلوك غير المعرَّفالسلوك غير المعرَّف (UB) هو شيفرة لا يضع معيار C++ عليها أي قواعد؛ فقد تتعطل أو تُفسد البيانات أو تبدو وكأنها تعمل. تعرّف على الأسباب الشائعة، ولماذا لا تُثبت عبارة "لقد عملت بلا مشاكل" أي شيء، والأدوات التي تكشف السلوك غير المعرَّف.