ورقة C++ المرجعية
آخر تحديث
Hello World وبنية البرنامج
يبدأ التنفيذ من main، التي تُرجع int.
| العنصر | الكود |
|---|---|
| تضمين ترويسة | #include <iostream> |
| نقطة الدخول | int main() { ... } |
| طباعة سطر | std::cout << "Hello, World!" << std::endl; |
| قراءة الإدخال | std::cin >> x; |
| استخدام مساحة الأسماء std | using namespace std; |
| إرجاع النجاح | return 0; |
| التعليقات | // line و /* block */ |
أنواع البيانات
| النوع | الوصف |
|---|---|
int | عدد صحيح (عادةً 32 بت) |
long / long long | أعداد صحيحة أوسع |
float / double | أعداد عشرية (نقطة عائمة) |
char | بايت واحد / حرف |
bool | true أو false |
std::string | نص ديناميكي من <string> |
auto | يستنتج المترجم النوع |
std::size_t | نوع غير مُشار للأحجام والفهارس |
المتغيرات والمراجع
المراجع أسماء مستعارة؛ والمؤشرات تحمل العناوين.
| العملية | الصياغة |
|---|---|
| التعريف والتهيئة | int x = 5; |
| التهيئة بالأقواس المعقوفة | int x{5}; |
| ثابت | const double PI = 3.14159; |
| ثابت وقت الترجمة | constexpr int N = 10; |
| مرجع (اسم مستعار) | int &r = x; |
| مؤشر | int *p = &x; |
| تفكيك مؤشر (dereference) | *p = 10; |
| استنتاج النوع | auto y = 3.14; |
التحكم في التدفق
| العبارة | الصياغة |
|---|---|
| If / else | if (x > 0) { ... } else { ... } |
| Switch | switch (n) { case 1: ...; break; default: ...; } |
| حلقة while | while (i < n) { ... } |
| حلقة do-while | do { ... } while (i < n); |
| حلقة for | for (int i = 0; i < n; i++) { ... } |
| for قائمة على النطاق | for (auto x : vec) { ... } |
| for قائمة على النطاق بمرجع | for (auto &x : vec) { ... } |
| Break / continue | break; تخرج من حلقة، و continue; تتخطّى إلى التكرار التالي |
الدوال
| العملية | الصياغة |
|---|---|
| تعريف دالة | int add(int a, int b) { return a + b; } |
| دون قيمة إرجاع | void greet() { ... } |
| وسائط افتراضية | int pow(int b, int e = 2) { ... } |
| التمرير بالمرجع | void inc(int &x) { x++; } |
| مرجع ثابت (دون نسخ) | void print(const std::string &s) { ... } |
| التحميل الزائد | int max(int a, int b); و double max(double a, double b); |
| Lambda | auto f = [](int x) { return x * 2; }; |
| Lambda مع التقاط | auto g = [n](int x) { return x + n; }; |
الأصناف والبرمجة الكائنية (OOP)
| العملية | الصياغة |
|---|---|
| تعريف صنف | class Dog { ... }; |
| محدّدات الوصول | public:, private:, protected: |
| متغير عضو | std::string name; |
| باني (constructor) | Dog(std::string n) : name(n) {} |
| هادم (destructor) | ~Dog() { ... } |
| دالة عضو | void bark() { ... } |
| إنشاء كائن | Dog d("Rex"); |
| الوراثة | class Puppy : public Dog { ... }; |
| دالة افتراضية (virtual) | virtual void speak(); |
حاويات STL
حاويات شائعة من المكتبة القياسية.
| الحاوية | الاستخدام والمثال |
|---|---|
std::vector<int> | مصفوفة ديناميكية: v.push_back(1); v.size(); |
std::string | نص: s += "!"; s.length(); |
std::array<int, 3> | مصفوفة ثابتة الحجم مع معلومات الحدود |
std::map<K, V> | مفتاح-قيمة مرتّب: m["a"] = 1; |
std::unordered_map<K, V> | خريطة hash (بحث أسرع، دون ترتيب) |
std::set<T> | قيم فريدة مرتّبة: s.insert(5); |
std::pair<A, B> | قيمتان: make_pair(1, "x") |
std::queue / std::stack | محوّلات طابور FIFO / مكدّس LIFO |
خوارزميات ومكرّرات STL
من <algorithm>؛ معظمها يأخذ نطاق مكرّر begin/end.
| العملية | الصياغة |
|---|---|
| مكرّرا البداية / النهاية | v.begin(), v.end() |
| الترتيب | std::sort(v.begin(), v.end()); |
| الترتيب التنازلي | std::sort(v.begin(), v.end(), std::greater<int>()); |
| إيجاد قيمة | auto it = std::find(v.begin(), v.end(), 5); |
| عدّ المطابقات | std::count(v.begin(), v.end(), 5); |
| العنصر الأصغر / الأكبر | std::max_element(v.begin(), v.end()); |
| جمع نطاق | std::accumulate(v.begin(), v.end(), 0); |
| تحويل كل عنصر | std::transform(v.begin(), v.end(), v.begin(), fn); |
المؤشرات الذكية و C++ الحديثة
فضّل المؤشرات الذكية على new/delete الخامة للتنظيف التلقائي.
| الميزة | الصياغة |
|---|---|
| ملكية فريدة | auto p = std::make_unique<Dog>("Rex"); |
| ملكية مشتركة | auto p = std::make_shared<Dog>("Rex"); |
| مرجع غير مالك | std::weak_ptr<Dog> w = p; |
| دلالات النقل (move) | auto v2 = std::move(v1); |
| Nullptr | int *p = nullptr; |
| الارتباطات المهيكلة | auto [key, val] = *it; |
| قيمة اختيارية | std::optional<int> maybe; |
| القوالب (Templates) | template <typename T> T add(T a, T b) { return a + b; } |
صياغة C++ وحاويات STL والميزات الحديثة التي تستخدمها أكثر من غيرها، على صفحة واحدة. ورقة C++ المرجعية هذه هي مرجع سريع لكتابة C++ - أنواع البيانات، والمراجع، والأصناف، وحاويات وخوارزميات المكتبة القياسية، والمؤشرات الذكية التي تحلّ محلّ new/delete الخامين.
كل ما هنا هو C++ قياسية (C++11 وما بعدها) ويُترجم بـ g++ أو clang++. انسخ ما تحتاجه، أو جرّب أيّ مقطع برمجي مباشرة في playground الخاص بـ C++ - دون الحاجة إلى تثبيت أي مترجم.
الأسئلة الشائعة حول ورقة C++ المرجعية
هل ورقة C++ المرجعية هذه مجانية؟
نعم. ورقة C++ المرجعية هذه مجانية تمامًا، دون الحاجة إلى التسجيل. أضِفها إلى المفضلة وارجع إليها متى احتجت إلى البحث عن صياغة أو حاوية STL أو مؤشر ذكي.
ما الفرق بين المؤشر والمرجع في C++؟
*p. أمّا المرجع (int &r = x) فهو اسم مستعار لمتغير موجود - يجب ربطه عند التعريف، ولا يمكن أبدًا أن يكون null أو يُعاد ربطه، ويُستخدم مثل المتغير نفسه. استخدم المراجع لمعاملات تمرير-بالمرجع أنظف، والمؤشرات عندما تحتاج إلى توجيه اختياري أو قابل لإعادة الإسناد.هل ينبغي أن أستخدم new/delete أم المؤشرات الذكية؟
std::unique_ptr و std::shared_ptr (عبر make_unique/make_shared) ذاكرتها تلقائيًا عند خروجها من النطاق، ما يمنع التسريبات والتحرير المزدوج الناتجين عن new/delete اليدوي. لا تلجأ إلى new/delete الخام إلا في الكود منخفض المستوى الذي لديه سبب محدّد.هل يمكنني التدرّب على C++ عبر الإنترنت؟
نعم. افتح playground الخاص بـ C++ لترجمة وتشغيل أيّ مقطع برمجي من هذه الورقة المرجعية في متصفحك - دون الحاجة إلى تثبيت أي مترجم. وعندما ترغب في تعلّم منظّم، تأخذك دورة C++ التفاعلية المجانية من Coddy من المتغيرات والحلقات إلى الأصناف و STL خطوة بخطوة.
هل هذه الورقة المرجعية مناسبة للمبتدئين؟
نعم. إنها مرتّبة من اللبنات الأكثر شيوعًا (الأنواع والتحكم في التدفق والدوال) وصولًا إلى المتقدمة (STL والمؤشرات الذكية)، بحيث يمكنك استخدام الأقسام العلوية من اليوم الأول والتدرّج إلى البقية.