ورقة 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++؟
*p. أمّا المرجع (int &r = x) فهو اسم مستعار لمتغير موجود - يجب ربطه عند التعريف، ولا يمكن أبدًا أن يكون null أو يُعاد ربطه، ويُستخدم مثل المتغير نفسه. استخدم المراجع لمعاملات تمرير-بالمرجع أنظف، والمؤشرات عندما تحتاج إلى توجيه اختياري أو قابل لإعادة الإسناد.هل ينبغي أن أستخدم new/delete أم المؤشرات الذكية؟
std::unique_ptr و std::shared_ptr (عبر make_unique/make_shared) ذاكرتها تلقائيًا عند خروجها من النطاق، ما يمنع التسريبات والتحرير المزدوج الناتجين عن new/delete اليدوي. لا تلجأ إلى new/delete الخام إلا في الكود منخفض المستوى الذي لديه سبب محدّد.