البرمجة

الأصناف والبُنيات في C++

الأصناف (Classes) والبُنيات (Structures) في C++: مفاهيم أساسية وفروقات هامة

في عالم البرمجة بلغة C++، تُعد الأصناف (Classes) والبُنيات (Structures) من الأساسيات التي لا غنى عنها لفهم البرمجة الكائنية التوجه (OOP). ورغم أن كلاهما يمثل نوعًا مخصصًا للبيانات يمكن أن يحتوي على متغيرات ودوال، إلا أن هناك فروقات جوهرية بينهما. في هذا المقال، سنستعرض المفاهيم الأساسية للأصناف والبُنيات، مع تسليط الضوء على الفروقات بينهما، وشرح كيفية استخدامهما في C++.

الأصناف (Classes) في C++

تُعتبر الأصناف في C++ أحد الركائز الأساسية التي تبني عليها البرمجة الكائنية التوجه (OOP). الصنف هو قالب (Template) يُستخدم لإنشاء كائنات (Objects) تحتوي على بيانات وطرق.

تعريف الصنف في C++

يُعرّف الصنف باستخدام الكلمة المفتاحية class. يحتوي الصنف على:

  • البيانات (Data members): هي المتغيرات التي تُخزن المعلومات المتعلقة بالكائن.

  • الدوال (Member functions): هي الوظائف التي تُنفّذ العمليات على البيانات أو تنفذ سلوكًا مرتبطًا بالكائن.

إليك مثالًا بسيطًا لتعريف صنف في C++:

cpp
#include using namespace std; class Person { public: string name; // بيانات الشخص int age; // دالة لتعيين القيم void setDetails(string n, int a) { name = n; age = a; } // دالة لعرض التفاصيل void displayDetails() { cout << "Name: " << name << ", Age: " << age << endl; } }; int main() { // إنشاء كائن من الصنف Person Person person1; // تعيين القيم للكائن person1.setDetails("Ali", 25); // عرض التفاصيل person1.displayDetails(); return 0; }
مفاهيم متقدمة في الأصناف
  1. المحددات (Access Specifiers): تستخدم لتحديد مستوى الوصول إلى البيانات والدوال في الصنف. هناك ثلاثة أنواع من المحددات:

    • public: البيانات والدوال متاحة لجميع الأجزاء من البرنامج.

    • private: البيانات والدوال تكون فقط ضمن الصنف نفسه.

    • protected: البيانات والدوال تكون متاحة في الصنف نفسه وأيضًا في الأصناف المشتقة.

  2. البناء (Constructor) والمُدمّر (Destructor):

    • البناء (Constructor): هو دالة خاصة تُنفّذ عند إنشاء كائن من الصنف. يُستخدم لتعيين القيم الأولية للبيانات.

    • المُدمّر (Destructor): هو دالة خاصة تُنفّذ عند تدمير الكائن، وتُستخدم لتنظيف الذاكرة إذا كان هناك تخصيص ديناميكي.

  3. الوراثة (Inheritance): يمكن أن يرث صنف معين (الصنف المشتق) من صنف آخر (الصنف الأساسي)، مما يتيح إعادة استخدام الكود وتوسيع الوظائف.

  4. التعددية (Polymorphism): يسمح لك بتعريف دوال في الصنف الأساسي، ويمكنك تغيير هذه الدوال في الأصناف المشتقة. توفر C++ التعددية باستخدام الدوال الافتراضية.

البُنيات (Structures) في C++

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

تعريف البُنية في C++

البُنية تُعرّف باستخدام الكلمة المفتاحية struct. وتشمل المتغيرات (أو العناصر) التي يُمكن أن تكون من أنواع بيانات مختلفة. إليك مثالًا بسيطًا على تعريف بنية:

cpp
#include using namespace std; struct Person { string name; // بيانات الشخص int age; }; int main() { // إنشاء كائن من البُنية Person Person person1; // تعيين القيم للكائن person1.name = "Ali"; person1.age = 25; // عرض التفاصيل cout << "Name: " << person1.name << ", Age: " << person1.age << endl; return 0; }
مفاهيم متقدمة في البُنيات
  1. المحددات (Access Specifiers) في البُنيات:
    في C++، تكون جميع العناصر في البُنية public افتراضيًا، على عكس الأصناف التي تكون private افتراضيًا.

  2. البُنيات مع الدوال:
    على الرغم من أن البُنيات غالبًا ما تُستخدم لتخزين البيانات فقط، إلا أنه يمكن أن تحتوي على دوال أيضًا، مثل الأصناف.

  3. الوراثة في البُنيات:
    البُنيات أيضًا تدعم الوراثة، ولكن هناك تمييز بين الوراثة في الأصناف والبُنيات في C++، حيث يتم عادة استخدام البُنيات بشكل أقل في الوراثة.

الفروقات بين الأصناف (Classes) والبُنيات (Structures)

في C++، تبدو الأصناف والبُنيات متشابهة جدًا من حيث البنية والوظيفة، لكن هناك بعض الفروقات الجوهرية بينهما:

الميزة الأصناف (Classes) البُنيات (Structures)
المحددات الافتراضية private افتراضيًا public افتراضيًا
الاستخدام تستخدم بشكل رئيسي في البرمجة الكائنية التوجه (OOP) تستخدم بشكل رئيسي لتخزين البيانات فقط
الدوال تدعم الدوال، والمحددات، والوراثة، والتعددية، إلخ. يمكن أن تحتوي على دوال ولكن غالبًا ما تكون للتخزين فقط
الوراثة تدعم الوراثة بشكل كامل تدعم الوراثة ولكن نادرًا ما تستخدم في هذا السياق

المقارنة بين الأصناف والبُنيات في السياقات المختلفة

  1. البرمجة الكائنية التوجه (OOP):
    في C++، الأصناف هي الركيزة الأساسية للبرمجة الكائنية التوجه. تستخدم الأصناف لإنشاء كائنات، وتنظيم البيانات والوظائف، ودعم الخصائص مثل الوراثة والتعددية. بينما البُنيات تُستخدم أكثر في سياقات لا تتطلب وظائف معقدة أو الوراثة، مثل تخزين المعلومات البسيطة.

  2. أداء C++ واستخدام الذاكرة:
    عادةً ما يكون استخدام الذاكرة للأصناف أكثر تعقيدًا، نظرًا لإمكانية استخدام المحددات والوظائف المتعددة والوراثة. بينما البُنيات في C++ تستخدم عادةً ذاكرة أقل، حيث أنها مجرد تجميع للبيانات.

  3. التحكم في الوصول:
    يسمح C++ بتحكم أكبر في الوصول إلى بيانات الكائنات من خلال الأصناف باستخدام محددات private و public و protected. أما البُنيات فتكون البيانات فيها عامة (public) بشكل افتراضي.

متى نستخدم الأصناف؟

يتم استخدام الأصناف عندما:

  1. تحتاج إلى إنشاء كائنات معقدة: تحتاج إلى تعريف دوال وسلوكيات مختلفة تعمل مع البيانات.

  2. تحتاج إلى خصائص مثل الوراثة أو التعددية: مثل البرمجة الكائنية التوجه التي تتطلب التعامل مع الكائنات بشكل ديناميكي.

متى نستخدم البُنيات؟

تُستخدم البُنيات عندما:

  1. تحتاج فقط إلى تخزين البيانات: ولا تحتاج إلى وظائف معقدة.

  2. تريد تسهيل الوصول إلى البيانات: لأن الوصول إليها يتم مباشرة عبر العناصر العامة.

خاتمة

تمثل الأصناف والبُنيات في C++ أداتين قويتين لتمثيل البيانات وتنظيمها، لكنهما تختلفان في جوانب متعددة تتعلق بالتحكم في الوصول، والقدرة على إضافة وظائف معقدة، وتقديم دعم للبرمجة الكائنية التوجه. الأصناف تمنحك القدرة على تحديد سلوكيات معقدة من خلال الدوال، بينما تُعد البُنيات أداة فعالة لتخزين البيانات البسيطة والوصول إليها بسرعة وسهولة.