مفهوم الكلاس Class : لإنشاء الكائنات في لغة سي بلس بلس نستخدم نوعا جديدا من أنواع البيانات يسمى بالكلاس class و هذه الكلمة class ترجمتها بالعربية (الطبقة) و في بعض المصادر تترجم بـ(الفئة) - أو (التصنيف) في مصادر أخرى ، و قد فضلت هنا استخدام الكلمة نفسها (الكلاس) لعل هذا يكون أسهل و أوضح. بعد إنشاء الكلاس - كما سنرى بعدقليل - يمكننا عمل عدد غير محدود من الكائنات - حسب الحاجة - من هذا الكلاس فالكلاس هو نوع بيانات جديد .. لتوضيح الفكرة : إذا كنت أريد الإعلان عن متغير اسمه SomeVariable من النوع integer فإن ذلك يتم كالتالي : كود:
int SomeVariable; و كذلك بنفس الطريقة نقوم بالاعلان عن الكائنات ، فمثلا إذا كان لدي كلاس اسمه Person و أردت الاعلان عن كائن :
كود:
Person Ali; فـ Ali هو كائن من كائنات الكلاس Person
قصدي مما ذكرت أن الكلاس هو نوع بيانات جديد يحتوي على البيانات (متغيرات) و عملياتها (دوال) معا و كل كائن يحتوى داخله على هذه البيانات و على عملياتها .
بطريقة أخرى الكلاس هو مثل المخطط الذي يوضح طريقة بناء مبنىً ما أما الكائن فهو المبنى نفسه و الذي بُني حسب المخطط.
إذن كيف يمكن الإعلان عن الكلاس و مم يتركب ؟
الجواب:
طريقة الإعلان عن الكلاس تشبه السجل structure حيث أن السجل يحتوي داخله متغيرات تسمى حقول أو أعضاء كما في المثال :
كود:
struct Person { char name[30]; char address[30]; int ID; //...; }Person; أعلنا هنا عن سجل إسمه Person يحتوي داخله على مجموعة من المتغيرات (الحقول) ... أما الكلاس فهو يحتوي على متغيرات تسمى عناصربيانات بالإضافة إلى الدوال التي تعمل على هذه المتغيرات و تسمى بالدوال الأعضاء - مع ملاحظة أن بعض الكلاسات تحتوي على متغيرات فقط - وللإعلان عن الكلاس نستخدم الكلمة المحجوزة class ثم اسم الكلاس و هذا يسمى بالرأس، ثم بقية المتن وتكون بين قوسين { }
(مثال 1): الإعلان عن كلاس اسمه Person لإدخال بيانات أشخاص و عناوينهم مع رقم فريد لكل شخص:
كود:
1. class Person{ 2. int ID; 3. char address[30]; 4. char name[30]; 5. public: 6. void EnterData(void); 7. void PrintData(void); 8.}; ملاحظة : الأرقام في المثال أعلاه - و كل الأمثلة التالية - هي للتوضيح في التحليل التالي و ليس من صلب الكود.
ملاحظة
أخرى: أنا أستخدم بورلاند سي بلس بلس الاصدار الخامس في تحرير و ترجمة
الكود فإذا كنت تستخدم مترجما أخر فلا بأس مع مراعاة الفروق ، كما يفضل عمل
مجلد منفصل لكل مثال لسهولة المراجعة فيما بعد.
تحليل:
1. هذا رأس الكلاس و فيه استخدمنا الكلمة المحجوزة class ثم اسم الكلاس Person
و يشترط في تسمية الكلاس نفس الشروط المطلوبة عند تسمية المتغيرات في لغة
سي بلس بلس مع مراعاة أن الأسماء ذات المعاني لها أهمية كبيرة و خاصة في
البرامج الكبيرة التي تكثر بها الكائنات و المتغيرات.
2. ~ 4. هذه عناصر البيانات و هي متغيرات يقوم المبرمج بتعريفها حسب الهدف من إنشاء الكلاس .
5. الكلمة المحجوزة public: هذه الكلمة مهمة جدا و هي ضمن ثلاث كلمات محجوزة تميز الكلاس عن السجل: Private: أي
خاص و هذه الكلمة تفيد المترجم بأن كل ما يليها من الأعضاء (متغيرات أو
دوال) محمي من الوصول إليه من خارج الكلاس – و سيأتي مزيد بيان عند الكلام
عن مفهوم الكبسلة بحول الله - . Protected: أي
محمي و ذلك يعني أن ما يليها من الأعضاء (متغيرات أو دوال ) محمي من
الوصول من خارج الكلاس و لكن يمكن الوصول إليها عن طريق الكلاسات المشتقة –
كما سيأتي عند الكلام عن التوريث ( الوراثة) - . Public: و
هي الكلمة المستخدمة في هذا المثال و تعني : عام ، أي كل ما يليها من
الأعضاء يمكن الوصول إليه من خارج الكلاس ، و هنا لا بد من تسجيل فرق مهم
من الفروق بين الكلاس و السجل: أعضاء
السجل تكون عامة بحيث يمكن الوصول إليها مباشرة بعكس الكلاس فالوضع
الافتراضي لعناصره أنها خاصة أي لا يمكن الوصول إليها من خارج الكلاس إلا
بوضعها تحت الكلمة public: ، و لذلك - في هذا المثال - كل ما قبل public
فهو إفتراضيا خاص لا يمكن الوصول إليه إلا عن طريق الدالتين الموضوعتين في
القسم العام ، و بالتالي إذا جربت السطر التالي – في الدالة main – لن يقبله منك المترجم : كود:
Ali.ID=1; - حيث Ali هو كائن من كائنات الكلاس Person – فعندم الترجمة سيعطيك المترجم رسالة خطأ شبيهة بالتالي: Error: PersonExample.cpp(136,16):'Person::ID' is not accessible مما يعني أنه لا يمكن الوصول لهذا العضو ( المتغير ) مباشرة إلا عن طريق الدوال المحددة لذلك . هذه خاصية مهمة جدا توفر الحماية لبيانات الكائن من أن يتم تعديلها من الخارج بطريقة غير مقصودة و هذه من خواص الـOOP المهمة. و قد يقول قائل : ما دام أن الأعضاء يكونون على الوضع خاص تلقائيا فلماذا نستخدم الكلمة المحجوزة private: ؟ الجواب : من الأفكار الجيدة أن تستخدم الكلمة private: لتوضيح مدى الأعضاء (متغيرات أو دوال ) و ذلك لتجنب جعل الأعضاء الخاصة عامة بدون قصد و لذلك من الأفضل أن يكون مثالنا كالتالي: كود:
class Person{ private: int ID; char address[30]; char name[30]; public: void EnterData(void); void PrintData(void); };
مع ملاحظة أن الترتيب ليس شرطا في صحة تعريف (الإعلان عن) الكلاس بحيث يمكن أن نعلن عن الكلاس السابق كالتالي:
كود:
class Person{ public: void EnterData(void); void PrintData(void); private: int ID; char address[30]; char name[30]; }; فكما تلاحظ تم وضع الدوال في القسم العام أولا و في هذه الحالة سيظل مفعول كلمة public: ساريا إلى نهاية الكلاس أو حتى استخدام كلمة أخرى تبطل مفعولها لذلك استخدمنا الكلمة private: قبل الأعضاء الذين نريد إخفاءهم.
6. هذا السطر يحوي رأس دالة عضو (member function) و تسمى أيضا بالطُرق أو العمليات (methods or operations ) و هذه الدالة و التي تليها ستكونان الواجهة التي سنتعامل بها مع بيانات الكلاس (الكائن) لذلك تم وضعها في القسم العام.
هذه الدالة هي التي ستقوم بإدخال البيانات لذلك سميناها EnterData و هي لا تعيد قيمة ، أو بالأصح تعيد قيمة من النوع void (لا شيء) كما أننا لا نمرر لها أي متغيرات.
7. هذا السطر كذلك يحوي رأس دالة عضو أخرى تقوم بعرض البيانات التي تم إدخالها و سميناها لذلك PrintData و هي كذلك تعيد قيمة من النوع void كما أنها لا تستقبل أي متغيرات (وسائط ) من الخارج.