أهم الكلمات المحجوزة في ++C التي ينبغي أن تعرفها

دقائق القراءة: 7

مقدمة إلى الكلمات المحجوزة في ++C

تضم لغة C++ مجموعة كبيرة من الكلمات المحجوزة التي تحمل معاني خاصة ومحددة مسبقاً داخل اللغة. وفهم هذه الكلمات ليس أمراً ثانوياً، بل هو أساس مهم لكتابة شيفرة صحيحة وواضحة وقابلة للصيانة. في هذا الدليل، سنستعرض أبرز الكلمات المفتاحية التي ستصادفها كثيراً أثناء تعلمك أو استخدامك للغة C++، مع توضيح دور كل كلمة وأمثلة عملية تساعدك على فهمها بسرعة.

شرح الكلمات المحجوزة في لغة سي بلس بلس مع أمثلة برمجية عملية

ما المقصود بالكلمات المحجوزة في C++؟

الكلمات المحجوزة أو Keywords هي كلمات تحتفظ بها اللغة لاستخدامات خاصة، ولذلك لا يمكن استعمالها كأسماء لمتغيرات أو دوال أو أصناف. لكل كلمة منها معنى نحوي أو دلالي محدد يفهمه المترجم مباشرة.

على سبيل المثال، لا يمكن استخدام الكلمة friend اسماً لدالة، لأن لها معنى خاصاً في اللغة. الشيفرة التالية تؤدي إلى خطأ:

void friend () { /*.......*/ }

بسبب ذلك، من الضروري التمييز بين أسماءك الخاصة في البرنامج وبين الكلمات التي حجزتها اللغة مسبقاً.

أشهر الكلمات المفتاحية في C++

الكلمة typedef في C++

أحياناً تكون بعض الأنواع البرمجية طويلة أو مزعجة عند التكرار، مثل النوع التالي:

const unsigned char

عندما يتكرر هذا النوع كثيراً داخل البرنامج، يصبح من العملي إنشاء اسم بديل له باستخدام typedef. هذه الكلمة لا تنشئ نوعاً جديداً فعلياً، لكنها تنشئ اسماً مرادفاً لنوع موجود.

typedef const unsigned char CON_UCHAR;

بدلاً من كتابة النوع الكامل كل مرة:

const unsigned char x;

يمكنك اختصاره هكذا:

CON_UCHAR x;

كما تُستخدم typedef كثيراً لتبسيط تعريفات المؤشرات:

typedef char * const CON_PTRCHAR;   // const pointer to char
typedef const char * PTR_CONCHAR;   // pointer to const char

يفيد هذا الأسلوب في جعل الشيفرة أوضح، خصوصاً عند التعامل مع الأنواع المركبة والمعقدة.

الكلمة bool في C++

النوع bool مخصص للتعامل مع القيم المنطقية، وله قيمتان فقط: true وfalse. في C++، تُعامل أي قيمة غير صفرية على أنها true، بينما تمثل القيمة 0 القيمة false.

if (1) {
    std::cout << "Hello World" << '\n';
} else {
    std::cout << "Sorry World" << '\n';
}

في المثال السابق، سيتم تنفيذ الفرع الأول دائماً لأن القيمة 1 غير صفرية، وبالتالي تعد صحيحة منطقياً.

ومن المهم أيضاً أن تتذكر أن true وfalse نفسيهما كلمتان محجوزتان في اللغة.

الكلمة using في C++

تُستخدم الكلمة using لتسهيل الوصول إلى الأسماء المعرفة داخل namespace معيّن. من أشهر الأمثلة التي يراها المبتدئون:

using namespace std;

هذه الصيغة تجعل جميع الأسماء الموجودة في std متاحة ضمن النطاق الحالي.

كما يمكن استخدام using على شكل تصريح مباشر باسم محدد:

namespace My_space {
    class My_class {
        /* Your code here */
    };
}

namespace Her_space {
    using My_space::My_class;
}

في هذا المثال، أصبح الاسم My_class متاحاً داخل النطاق Her_space دون الحاجة إلى كتابة المسار الكامل كل مرة.

ورغم فائدة using namespace std; في الأمثلة التعليمية، فإن استخدامه في المشاريع الكبيرة يحتاج إلى حذر لتجنب تعارض الأسماء.

الكلمات public وprotected وprivate في C++

تُستخدم هذه الكلمات كمحددات وصول داخل الأصناف class، وهي تحدد من يستطيع الوصول إلى الأعضاء والوظائف داخل الصنف.

class Home {
private:
    int members;
protected:
    double tot_expenditure;
public:
    void display_detail();
};
  • private: الأعضاء بعد هذا المحدد لا يمكن الوصول إليهم مباشرة من خارج الصنف، ويكون الوصول إليهم عادة عبر دوال عضو.
  • public: الأعضاء بعد هذا المحدد يمكن الوصول إليهم من أي مكان يسمح به السياق.
  • protected: تشبه private بالنسبة للكود الخارجي، لكنها تبقى متاحة للأصناف المشتقة.

ومن الجدير بالذكر أن أعضاء class تكون private افتراضياً إذا لم تُذكر أي محددات وصول.

الكلمة enum في C++

تُستخدم enum لتعريف نوع تعدادي Enumeration، وهو نوع مخصص من إنشاء المبرمج يضم مجموعة قيم ثابتة ومحددة.

enum days { SUN, MON, TUE, WED, THU, FRI, SAT };

القيم SUN وMON وTUE وغيرها تُسمى enumerators، وتحصل افتراضياً على قيم عددية تبدأ من 0 ثم تزداد تدريجياً.

وبالتالي تكون:

  • SUN == 0
  • MON == 1
  • TUE == 2

كما يمكنك تعيين القيم يدوياً:

enum { a = 5, b = 6 };

يُفيد هذا النوع في تمثيل الحالات الثابتة بشكل أوضح من استخدام الأرقام المجردة داخل البرنامج.

الكلمة new في C++

تُستخدم الكلمة new، وهي أيضاً عامل operator، لحجز مساحة في الذاكرة الديناميكية المعروفة باسم heap أو free store.

int main() {
    int *p = new int;
    *p = 20;
    //..
}

في هذا المثال، يقوم new بحجز مساحة كافية لتخزين عدد صحيح من النوع int، ثم يعيد مؤشراً إلى ذلك العنوان.

هذا الأسلوب مفيد عندما تحتاج إلى إنشاء كائنات أو بيانات أثناء تشغيل البرنامج وليس أثناء الترجمة فقط.

الكلمة delete في C++

بما أن الذاكرة مورد مهم، يجب تحرير المساحة التي لم تعد بحاجة إليها. وهنا يأتي دور delete، إذ تُستخدم لتحرير الذاكرة التي سبق حجزها بواسطة new.

int main() {
    int *p = new int;
    *p = 20;
    delete p;
    //..
}

إذا أهملت استخدام delete عند الحاجة، فقد تتسبب في تسرب للذاكرة Memory Leak، وهو من المشكلات الشائعة في البرامج الكبيرة.

لذلك، من المهم دائماً أن تربط بين new وdelete بطريقة صحيحة، أو تعتمد على الأساليب الحديثة في الإدارة التلقائية للموارد عندما يكون ذلك ممكناً.

الكلمة this في C++

داخل الدوال العضوية غير الساكنة non-static member functions، توفر اللغة المؤشر this للإشارة إلى الكائن الحالي الذي استدعى الدالة.

class A {
    int b;
public:
    void display() const;
};

يمكن كتابة الدالة بالشكل التالي:

void A::display() const {
    cout << "b = " << b << '\n';
}

ويمكن أيضاً كتابتها باستخدام this بشكل صريح:

void A::display() const {
    cout << "b = " << this->b << '\n';
}

لاحظ أن this هو مؤشر، لذلك نستخدم معه العامل ->. استخدامه يكون مفيداً عندما تريد إزالة الالتباس بين عضو في الصنف ومتغير محلي يحمل الاسم نفسه، أو عندما تحتاج إلى تمرير الكائن الحالي صراحة.

الكلمة class في C++

لأن C++ تدعم البرمجة كائنية التوجه Object-Oriented Programming، فإن مفهوم الأصناف classes يعد محورياً فيها. وتُستخدم الكلمة class لتعريف صنف جديد.

class Fb_user {
    //..your code here
};

وهناك أيضاً الكلمة struct، وهي كلمة محجوزة كذلك. والفرق العملي الأساسي هنا أن أعضاء struct تكون public افتراضياً، بينما أعضاء class تكون private افتراضياً.

struct Fb_user {
    //...Your code here
};

والشيفرة السابقة تعادل تقريباً:

class Fb_user {
public:
    //..your code here
};

فهم هذا الفرق يساعدك على اختيار البنية الأنسب بحسب طبيعة البيانات ومسؤوليات التصميم.

الكلمة operator في C++

تُستخدم الكلمة operator عند تحميل العوامل Operator Overloading، وهي ميزة تسمح بإعطاء سلوك مخصص للعوامل المعروفة مثل + و- و== عند التعامل مع الأنواع التي ينشئها المبرمج.

الصيغة العامة تكون كالتالي:

return_type operator operator_symbol(parameters) {
    //...Your code here...
}

يُعد تحميل العوامل مفيداً عندما تريد جعل التعامل مع الكائنات أكثر طبيعية ووضوحاً، لكن ينبغي استخدامه بحذر حتى لا تصبح الشيفرة مربكة أو غير متوقعة.

الكلمة inline في C++

تُستخدم inline مع الدوال للإشارة إلى أن المترجم يمكنه توسيع جسم الدالة مباشرة في موضع الاستدعاء بدلاً من إجراء استدعاء دالة تقليدي.

وإذا عرّفت دالة عضو داخل تعريف الصنف نفسه، فإنها تُعامل عادة كأنها inline. كما يمكن التصريح بذلك صراحة:

class Random {
    int a;
public:
    int display() const;
};

inline int Random::display() const {
    return a;
}

لكن يجب الانتباه إلى أن inline ليست أمراً إلزامياً للمترجم، بل هي مجرد طلب أو تلميح، وقد يقرر المترجم تجاهله وفقاً لاعتبارات التحسين.

الكلمة goto في C++

تدعم C++ أيضاً الكلمة goto، وهي تُستخدم للقفز من موضع إلى آخر داخل الدالة نفسها باستخدام label محدد.

int main() {
    for (int i = 0; i < 5; i++) {
        for (int j = 0; j < 5; j++) {
            if (/* some condition */) {
                goto here;
            }
        }
    }

here:
    cout << "I am here" << '\n';
}

يمكن أن يكون goto مفيداً في حالات محدودة، مثل الخروج من حلقات متداخلة بسرعة، لكن استخدامه المفرط قد يجعل تدفق البرنامج صعب الفهم والتتبع. لهذا السبب، يُنصح غالباً بتجنبه ما لم توجد حاجة واضحة ومبررة.

ملخص سريع لأهم الكلمات المفتاحية

  • typedef: لإنشاء اسم بديل لنوع موجود.
  • bool: لتمثيل القيم المنطقية.
  • using: لتسهيل الوصول إلى الأسماء داخل namespace.
  • public وprotected وprivate: للتحكم في صلاحيات الوصول داخل الأصناف.
  • enum: لتعريف أنواع تعدادية.
  • new وdelete: لإدارة الذاكرة الديناميكية.
  • this: للإشارة إلى الكائن الحالي.
  • class: لتعريف الأصناف.
  • operator: لتحميل العوامل.
  • inline: لتحسين استدعاء بعض الدوال.
  • goto: للقفز بين المواضع داخل الدالة.

أفضل ممارسات عند التعامل مع كلمات C++ المحجوزة

  1. لا تستخدم الكلمات المحجوزة كأسماء متغيرات أو دوال.
  2. اختر الكلمات المفتاحية المناسبة بحسب سياق التصميم، وليس لمجرد أنها متاحة.
  3. احرص على كتابة الشيفرة بوضوح، خاصة عند استخدام ميزات مثل operator overloading أو goto.
  4. تجنب الإدارة اليدوية للذاكرة ما لم تكن هناك حاجة حقيقية، وكن دقيقاً عند استخدام new وdelete.
  5. افهم الفروق الدقيقة بين class وstruct وبين private وprotected وpublic قبل بناء هياكل أكبر.

الخلاصة التقنية

إتقان الكلمات المحجوزة في C++ لا يعني حفظها فقط، بل فهم أثرها على بنية البرنامج وأدائه وقابليته للتطوير. بعض هذه الكلمات، مثل class وprivate وthis، ترتبط مباشرة بالتصميم الكائني، بينما ترتبط كلمات أخرى مثل new وdelete بإدارة الموارد والذاكرة. وكلما كان فهمك لهذه الكلمات أعمق، أصبحت شيفرتك أكثر احترافية وأقرب إلى المعايير الحديثة في تطوير البرمجيات.

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *