مصفوفة من الكائنات object ومؤشرات للكائنات objects
في عالم البرمجة الكائنية (OOP) مع لغة C++، تعد إدارة كائنات متعددة بكفاءة أمرًا بالغ الأهمية. هناك مفهومان قويان يساعدان في تحقيق ذلك مصفوفة الكائنات Arrays of Objects و مؤشرات للكائنات Pointers to Objects. سنوضح كلا المفهومين وكيفية توظيفهما في لغة C++.
مثال 1:
#include <iostream> using namespace std; int main() { int arr[5] = {10, 50, 40, 77, 33}; // Printing the memory address of the array (address of the first element) cout << arr << endl; // Printing the value at the first element of the array cout << *arr << endl; // Printing the memory address of the second element of the array cout << arr + 1 << endl; // Printing the memory address of the last element of the array cout << arr + 4 << endl; // Printing the value at the last element of the array cout << *(arr + 4) << endl; // Using a loop to print all elements of the array using pointer arithmetic for (size_t i = 0; i < 5; i++) { cout<< *(arr + i) << endl; } return 0; }
يوضح هذا البرنامج استخدام المؤشرات مع المصفوفات.
ستعرض المخرجات عناوين الذاكرة وقيمها وعناصر المصفوفة بناءً على حساب المؤشر وتكرارات الحلقة.
مثال 2:
#include <iostream> using namespace std; int main() { int arr[5] = {10, 50, 40, 77, 33}; int *p; p = arr; for (size_t i = 0; i < 5; i++) { cout << *p << endl; p++; } return 0; }
يوضح برنامج C++ هذا استخدام المؤشر للتكرار عبر مصفوفة.
ستعرض المخرجات قيم كل عنصر في المصفوفة، مطبوعًا واحدًا تلو الآخر، حيث يتم زيادة المؤشر p داخل الحلقة.
10 50 40 77 33
ملحوظة !
- يتم تعيين المؤشر p مبدئيًا على عنوان العنصر الأول في المصفوفة.
- زيادة المؤشر (p++) يجعله يشير إلى العنصر التالي في المصفوفة.
- يوفر هذا الأسلوب طريقة بديلة للتكرار عبر عناصر المصفوفة باستخدام المؤشرات.
مثال 3:
#include <iostream> #include <cstdlib> #include <cstring> using namespace std; class Student { char name[20]; int ID; public: Student() //empty constructor { cout << "empty\n"; strcpy(name, "No name"); ID = 0; } Student(char n[], int id) //constructor overloading { cout << "parameterize\n"; strcpy(name, n); ID = id; } void print(void) { cout << name << "\t" << ID << endl; } }; int main() { Student S1("Ali", 123), S2("Ahmad", 456); Student arr[3]; for (int i = 0; i < 3; i++) arr[i].print(); return 0; }
يوضح هذا البرنامج استخدام constructor overloading وdefault constructors في الـclass. دعونا نحلل الكود:
- Class Student:
يحدد class يسمى الطالب مع اسم ومعرف أعضاء البيانات الخاصة.
يحتوي على constructors اثنين: constructor فارغ وparameterized constructor.
يوفر دالة عضو وهي دالة الطباعة لعرض تفاصيل الطالب. - Empty Constructor:
Student() { cout << "empty\n"; strcpy(name, "No name"); ID = 0; }
تهيئة الاسم بـ "No name" والمعرف بـ 0.
طباعة "empty" عند إنشاء كائن باستخدام هذا الـconstructor. - Constructor Overloading:
Student(char n[], int id) { cout << "parameterize\n"; strcpy(name, n); ID = id; }
تهيئة الاسم والمعرف باستخدام الـarguments المتوفرة.
طباعة "parameterize" عند إنشاء كائن باستخدام هذا الـconstructor. - print() Function:
void print(void) { cout << name << "\t" << ID << endl; }
طباعة اسم الطالب وهويته.
- إنشاء كائنات:
يتم إنشاء الكائنين S1 وS2 باستخدام parameterized constructor، مع عرض "parameterize" لكل كائن.
يتم إنشاء مصفوفة من كائنات الطالب باستخدام default constructor، مع عرض "empty" لكل كائن. - طباعة تفاصيل الطالب:
يتم استدعاء الدالة print() لكل كائن في المصفوفة لعرض تفاصيله.
المخرجات:
ستعرض المخرجات رسائل الـconstructor وتفاصيل كل طالب في المصفوفة.