دلالات النقل هي وسيلة لنقل كائن إلى آخر في C++، عبر إفراغ الكائن القديم، وتبديل محتوياته بمحتويات الكائن الجديد. ولفهم دلالات النقل، من الضروري فهم المقصود بالمرجع اليميني (rvalue reference). وهي، أي المراجع اليمينية (T&…
ما المقصود بالسلوك غير المعرَّف (undefined behavior أو UB)؟ وفقًا لمعيار ISO C++ (الفقرة 1.3.24، N4296)، فهو:
هذا يعني أنّه عندما يواجه البرنامج سلوكًا غير معرَّف، فإنّه يُسمَح له بفعل ما يريد. هذا قد يعني غالبًا التوق…
كلمة SFINAE هي اختصار للجملة: Substitution Failure Is Not An Error، وتشير إلى أنّه لا تُعد الشيفرات سيئة الصيغة بسبب تعويض الأنواع (أو القيم) لأجل استنساخ قالب دالة (instantiate a function template) أو قالب صنف، لا تُعدُّ خطأ…
آلية RTTI: معلومات الأنواع في وقت التشغيل (Run-Time Type Information)
dynamic_cast
استخدم dynamic_cast<>() كدالة تساعدك على التخفيض النوعي (downcasting) في التسلسل الهرمي للوراثة (الوصف الرئيسي). وإذا كنت بح…
قاعدة الصفر
الإصدار ≥ C++ 11
عند الجمع بين مبادئ "قاعدة الخمسة" (Rule of Five) و RAII نحصل على "قاعدة الصفر" (Rule of Zero) ذات الواجهة الرشيقة، والتي قدمها مارتينيو فرنانديز لأول مرة، وتنصّ على أنّ أيّ مورِدٍ تجب…
كيفية إنشاء خيط std::thread
تُنشَأ الخيوط في C++ باستخدام الصنف std::thread، والخيط (thread) هو مسار تنفيذ منفصل أشبه بمساعد يساعدك على أداء مهمة فرعية أثناء إنجازك لمهمة أخرى، ثم يتوقف عند اكتمال تنفيذ الشيفرة في الخيط…
صار بالإمكان قولبة الأصناف والدوالّ والمتغيّرات في لغة ++C منذ C++ 14، والقالب هو شيفرة لها بعض المعاملات الحرّة (free parameters) التي ستُستبدَل فيما بعد بأصناف أو دوال أو متغيّرات حقيقية عند تحديد تلك المعاملات.
وقد ت…
معالج C الأولي هو محلّل/مبدّل نصوص يُشغَّل قبل التصريف الفعلي للشيفرة، ويُستخدم لتوسيع وتيسير استخدام لغة C (وكذلك C++ لاحقًا)، ويمكن استخدامه من أجل:
تضمين ملفّات أخرى باستخدام #include.
تعريف شيفرة جامعة (m…
تُسنَد فئات القيمة إلى تعبيرات C++ بناءً على نتائج تلك التعبيرات، ويمكن لهذه الفئات أن تؤثّر على تحليل التحميل الزائد (overload resolution) للدوالّ في C++، كما تحدّد خاصّيتين مهمَّتين ومنفصلتين حول التعابير، تحدد الأول منهم…
ما هي تعابير لامدا؟
توفّر دوال لامدا طريقة موجزة لإنشاء كائنات دوالّ بسيطة، وتعبير لامدا هو قيمة يمينية خالصة (prvalue) تُنتجُ كائنَ تغليف (closure)، والذي يتصرف ككائن دالة.
نشأ الاسم "تعبير لامدا" (lambda expressio…
إمساك الاستثناءات Catching exceptions
تُستخدَم الكتلة try/catch لإمساك الاستثناءات إذ توضع في القسم try الشيفراتُ التي يُشتبه في أنّها قد ترفع استثناءً، فيما تتكفّل الشيفرة الموضوعة في الكتلة catch بمعالجة الاستثنا…
حجم الأنواع العددية الصحيحة
الأنواع التالية هي أنواع عددية صحيحة:
char
الأنواع العددية الصحيحة المُؤشّرة Signed integer types
الأنواع العددية الصحيحة غير المُؤشّرة Unsigned integer types
ch…
التعبيرات النمطية (تُسمّى أحيانًا regexs أو regexps) هي صِيغ نصّية تمثّل الأنماط التي يمكن مطابقتها في السلاسل النصّية، وقد تدعم التعبيرات النمطيّة التي قُدِّمت في C++ 11 -اختياريًا- إعادة مصفوفة من السلاسل النصّية المطابِقة…
التكرار Iteration
do
تقدِّم تعليمة do حلقة do-while، انظر المثال التالي حيث نحصل على المحرف التالي غير الفارغ من مجرى الدخل القياسي:
char read_char() {
char c;
do {
c = getchar();
} while (is…
الترتيب وحاويات التسلسلات
std::sort هي خوارزمية لتَرتيب مجموعة من القي، وتوجد في ترويسة المكتبة القياسية algorithm، وهي مُعرّفة بواسطة زوج من المُكرّرات. وتأخذ std::sort كائنًا داليًّا كمعامل أخير للموازنة بين قيمتين…
مولد قيم عشوائية حقيقيّة
لإنشاء قيم عشوائية حقّا (generate true random) يمكن استخدامها في التشفير، يجب استخدام std::random_device كمُولِّد.
#include <iostream>
#include <random>
int main() {
std::r…
std::next_permutation
المثال التالي يبدل تسلسل المجال [first, last] ويحوّله إلى التبديل التالي الأعلى في الترتيب المعجمي (lexicographically higher permutation)، ويمكن تخصيص قاعدة التبديل عبر cmpFun.
template < cl…
std::optional: القيم الاختيارية
تُستخدم القيم الاختيارية (المعروفة أيضًا باسم "أنواع الشّك") لتمثيل نوع قد يكون محتواه موجودًا أو لا، وقد قُدِّمت في C++ 17 على هيئة صنف std::optional. فمثلًا، قد يحتوي كائن من النوع s…
نبدأ بدايةً بسرد بعض الأمور المتعلقة بالقاموس أو النوع std::map:
لاستخدام أحد الصنفين std::map (القواميس) أو std::multimap (القواميس المتعدّدة)، يجب تضمين الترويسة.
تُبقي القواميس والقواميس المتعدّدة عناصرها …
المتّجه هو مصفوفة ديناميكية تخزّن البيانات تلقائيًّا، ويمكن الوصول إلى العناصر الموجودة في المتّجه بنفس طريقة المصفوفات، مع ميزة أنّ المتّجهات يمكن أن يتغير حجمها ديناميكيًا.
وبشأن التخزين، تُوضع بيانات المتجه عادة في ذا…