مصفوفة من الكائنات 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 وتفاصيل كل طالب في المصفوفة.