C++ الفئة والكائن مع المثال
⚡ ملخص ذكي
الفئات والكائنات في C++ تشكل هذه الأسس أساس البرمجة الكائنية التوجه، حيث يحدد الصنف مخططًا للبيانات ووظائف الأعضاء، ويكون الكائن هو نسخة ملموسة تم إنشاؤها من ذلك المخطط.

ما هي الدرجة؟
A C++ يجمع الفصل البيانات وطرق معالجة البيانات في ملف واحد. تحدد الفصول أيضًا أشكال الكائنات. تُعرف البيانات والأساليب الموجودة في الفصل باسم أعضاء الفصل. الفئة هي نوع بيانات محدد من قبل المستخدم. للوصول إلى أعضاء الفصل، نستخدم مثيلًا للفئة. يمكنك رؤية الفصل كمخطط لكائن ما.
يمكن أن يكون الصنف نموذجًا أوليًا لمنزل. فهو يُظهر موقع وأحجام الأبواب والنوافذ والأرضيات، وما إلى ذلك. انطلاقًا من هذه الأوصاف، يُمكننا بناء منزل. يصبح المنزل هو الكائن. من الممكن إنشاء العديد من المنازل من النموذج الأولي. كما يُمكن إنشاء العديد من الكائنات من الصنف.
في الشكل أعلاه، لدينا نموذج أولي لمنزل واحد. من هذا النموذج الأولي، قمنا بإنشاء منزلين بميزات مختلفة.
مع وضع فكرة الفئة كنموذج أولي في الاعتبار، فإن الخطوة التالية هي معرفة كيفية تعريفها في الكود.
إعلان الطبقة
In C++يتم تعريف الفئة باستخدام الكلمة المفتاحية class. يجب أن يتبع ذلك اسم الفئة. ثم يتم إضافة جسم الفئة بين قوسين معقوفين { }.
بناء الجملة
class class-name { // data // functions };
- استخدم اسم الطبقة هذا هو الاسم الذي سيتم تعيينه للفئة.
- استخدم البيانات هي بيانات الفئة، والتي يتم تعريفها عادةً كمتغيرات.
- استخدم وظائف هي دوال الفئة.
إن تحديد اسم الفئة وهيئتها يثير بطبيعة الحال مسألة من يحق له استخدام كل عضو.
الكلمات الرئيسية الخاصة والعامة
لا بد أنك صادفت هاتين الكلمتين الرئيسيتين. هم معدلات الوصول.
خاصة:
عندما يتم استخدام الكلمة الأساسية الخاصة لتحديد وظيفة أو فئة، فإنها تصبح خاصة. لا يمكن الوصول إلى هذه إلا من داخل الفصل.
عامة:
من ناحية أخرى، الكلمة الأساسية العامة تجعل البيانات/الوظائف عامة. ويمكن الوصول إليها من خارج الفصل.
بعد إنشاء فئة، يمكن إنشاء كائنات منها، تمامًا كما يتم إنشاء المتغيرات من نوع البيانات.
تعريف الكائن
تُنشأ الكائنات من الأصناف. تُصرَّح كائنات الأصناف بطريقة مشابهة لتصريح المتغيرات. يجب أن يأتي اسم الصنف أولًا، متبوعًا باسم الكائن. الكائن من نوع الصنف.
بناء الجملة
class-name object-name;
- استخدم اسم الطبقة هو اسم الفئة التي سيتم إنشاء الكائن منها.
- استخدم كائن اسم هذا هو الاسم الذي سيتم تعيينه للكائن الجديد.
تُعرف عملية إنشاء كائن من فئة باسم إنشاء مثيل.
بمجرد إنشاء الكائن، يمكن الوصول إلى أعضائه العامة مباشرة من خلال عامل تشغيل بسيط.
الوصول إلى أعضاء البيانات
للوصول إلى الأعضاء العامة لفئة ما، نستخدم عامل النقطة (.)dot. هذه هي الأعضاء التي تم تمييزها بعلامة تعديل الوصول العام.
مثال 1
#include <iostream> using namespace std; class Phone { public: double cost; int slots; }; int main() { Phone Y6; Phone Y7; Y6.cost = 100.0; Y6.slots = 2; Y7.cost = 200.0; Y7.slots = 2; cout << "Cost of Huawei Y6 : " << Y6.cost << endl; cout << "Cost of Huawei Y7 : " << Y7.cost << endl; cout << "Number of card slots for Huawei Y6 : " << Y6.slots << endl; cout << "Number of card slots for Huawei Y7 : " << Y7.slots << endl; return 0; }
الإخراج:
فيما يلي لقطة شاشة للكود:
Code التفسير:
- قم بتضمين ملف رأس iostream في الكود الخاص بنا من أجل استخدام وظائفه.
- تضمين مساحة الاسم std في الكود الخاص بنا لاستخدام فئاتها دون الاتصال بها.
- قم بتعريف فئة تسمى الهاتف.
- استخدام مُعدِّل الوصول العام لتحديد المتغيرات التي نحن على وشك إنشائها على أنها متاحة للعامة.
- إعلان التكلفة المتغيرة لنوع البيانات المزدوج.
- قم بتعريف متغير عدد صحيح يسمى فتحات.
- نهاية الجسم الصفي.
- استدعاء الوظيفة الرئيسية (). يجب إضافة منطق البرنامج داخل جسمه.
- قم بإنشاء كائن باسم Y6 من النوع Phone. وهذا ما يسمى إنشاء مثيل.
- قم بإنشاء كائن باسم Y7 من النوع Phone. وهذا ما يسمى إنشاء مثيل.
- قم بالوصول إلى تكلفة المتغير/العضو لفئة Phone باستخدام الكائن Y6. تم ضبط القيمة على 100.0. تم الآن ضبط تكلفة Y6 على 100.0.
- قم بالوصول إلى فتحات المتغير/العضو لفئة Phone باستخدام الكائن Y6. تم تعيين القيمة على 2. تم الآن ضبط فتحات Y6 على 2.
- قم بالوصول إلى تكلفة المتغير/العضو لفئة Phone باستخدام الكائن Y7. تم ضبط القيمة على 200.0. تم الآن ضبط تكلفة Y7 على 200.0.
- قم بالوصول إلى فتحات المتغير/العضو لفئة Phone باستخدام الكائن Y7. تم تعيين القيمة على 2. تم الآن ضبط فتحات Y7 على 2.
- اطبع تكلفة Y6 على وحدة التحكم بجانب النص الآخر.
- اطبع تكلفة Y7 على وحدة التحكم بجانب النص الآخر.
- اطبع عدد الفتحات الخاصة بـ Y6 بجانب النص الآخر.
- اطبع عدد الفتحات الخاصة بـ Y7 بجانب النص الآخر.
- يجب أن يقوم البرنامج بإرجاع قيمة عند اكتماله بنجاح.
- نهاية نص الدالة main().
الأعضاء العامون منفتحون على البرامج الخارجية، لكن الأعضاء الخاصين يتبعون قواعد وصول أكثر صرامة.
ما هي الدرجة الخاصة؟
لا يمكن الوصول إلى أعضاء الفصل الذين تم وضع علامة خاص عليهم إلا من خلال الوظائف المحددة داخل الفصل. لا يمكن لأي كائن أو وظيفة محددة خارج الفصل الوصول إلى هؤلاء الأعضاء مباشرة. لا يمكن الوصول إلى عضو الفئة الخاصة إلا من خلال وظائف الأعضاء والأصدقاء.
مثال 2
#include <iostream> using namespace std; class ClassA { public: void set_a(int val); int get_a(void); private: int a; }; int ClassA::get_a(void) { return a; } void ClassA::set_a(int val) { a = val; } int main() { ClassA a; a.set_a(20); cout << "Value of a is: " << a.get_a(); return 0; }
الإخراج:
فيما يلي لقطة شاشة للكود:
Code التفسير:
- قم بتضمين ملف رأس iostream في الكود الخاص بنا لاستخدام وظائفه.
- قم بتضمين مساحة الاسم std في الكود الخاص بنا لاستخدام فئاتها دون استدعائها.
- قم بإنشاء فئة تسمى ClassA.
- استخدم معدّل الوصول العام لوضع علامة على عضو الفصل المراد إنشاؤه على أنه يمكن الوصول إليه بشكل عام.
- قم بإنشاء الدالة المسماة set_a() والتي تأخذ قيمة عددية واحدة val.
- قم بإنشاء دالة باسم get_a().
- استخدم معدّل الوصول الخاص لوضع علامة على عضو الفصل الذي سيتم إنشاؤه على أنه يمكن الوصول إليه بشكل خاص.
- قم بتعريف متغير عدد صحيح يسمى a.
- نهاية الجسم الصفي.
- استخدم اسم الفصل ومشغل حل النطاق للوصول إلى الدالة get_a(). نريد تحديد ما تفعله الدالة عند استدعائها.
- يجب أن تقوم الدالة get_a() بإرجاع قيمة المتغير a عند استدعائه.
- نهاية تعريف الدالة get_a().
- استخدم اسم الفصل ومشغل حل النطاق للوصول إلى الدالة set_a(). نريد تحديد ما تفعله الدالة عند استدعائها.
- إسناد قيمة المتغير val إلى المتغير a.
- نهاية تعريف الدالة set_a().
- استدعاء الدالة الرئيسية (). يجب إضافة منطق البرنامج داخل نص هذه الوظيفة.
- قم بإنشاء مثيل ClassA وأعطه الاسم a.
- استخدم مثيل الفئة أعلاه والدالة set_a() لتعيين قيمة 20 للمتغير a.
- طباعة بعض النصوص بجانب قيمة المتغير a على وحدة التحكم. يتم الحصول على قيمة المتغير a عن طريق استدعاء الدالة get_a().
- يجب أن يقوم البرنامج بإرجاع القيمة عند اكتماله بنجاح.
- نهاية نص الوظيفة الرئيسية ().
يقع الأعضاء المحميون بين الخاص والعام، مما يضيف قدرة رئيسية واحدة للتوريث.
ما هي الفئة المحمية؟
يتمتع أعضاء الفصل الذين تم وضع علامة عليهم على أنهم محميون بميزة على أولئك الذين تم وضع علامة عليهم على أنهم خاصون. يمكن الوصول إليها عن طريق الوظائف ضمن فئة تعريفها. بالإضافة إلى ذلك، يمكن الوصول إليها من الفئات المشتقة.
مثال 3
#include <iostream> using namespace std; class ParentClass { protected: int value; }; class ChildClass : public ParentClass { public: void setId(int x) { value = x; } void displayValue() { cout << "Value is: " << value << endl; } }; int main() { ChildClass c; c.setId(21); c.displayValue(); return 0; }
الإخراج:
فيما يلي لقطة شاشة للكود:
Code التفسير:
- قم بتضمين ملف رأس iostream في الكود الخاص بنا لاستخدام وظائفه.
- قم بتضمين مساحة الاسم std في الكود الخاص بنا لاستخدام فئاتها دون استدعائها.
- قم بإنشاء فئة تسمى ParentClass.
- استخدم معدّل الوصول المحمي لوضع علامة على عضو الفصل المراد إنشاؤه على أنه محمي.
- قم بإنشاء متغير عدد صحيح يسمى القيمة.
- نهاية الجسم الصفي.
- قم بإنشاء فئة جديدة تسمى ChildClass التي ترث ParentClass.
- استخدم معدّل الوصول المحمي لوضع علامة على عضو الفصل الذي سيتم إنشاؤه على أنه يمكن الوصول إليه من قبل الفئات الفرعية.
- قم بإنشاء الدالة المسماة setId() والتي تأخذ قيمة عددية واحدة x.
- إسناد قيمة المتغير x إلى قيمة المتغير.
- نهاية تعريف الدالة setId().
- قم بإنشاء وظيفة باسم DisplayValue ().
- قم بطباعة قيمة المتغير المسمى value على وحدة التحكم بجانب النص الآخر.
- نهاية نص الدالة DisplayValue().
- نهاية نص الفصل المسمى ChildClass.
- استدعاء الدالة الرئيسية (). يجب إضافة منطق البرنامج داخل نص هذه الوظيفة.
- قم بإنشاء مثيل لـ ChildClass وأعطه الاسم c.
- استخدم مثيل الفئة أعلاه والدالة setId() لتعيين قيمة 21 للمتغير x.
- استخدم مثيل الفئة أعلاه لاستدعاء الوظيفة المسماة DisplayValue ().
- يجب أن يقوم البرنامج بإرجاع القيمة عند اكتماله بنجاح.
- نهاية نص الوظيفة الرئيسية ().
إلى جانب تخزين البيانات، تقوم الفئة أيضًا بتجميع الوظائف التي تعمل على تلك البيانات.
وظائف أعضاء الفصل
تساعدنا الوظائف في معالجة البيانات. يمكن تعريف وظائف أعضاء الفئة بطريقتين:
- داخل تعريف الطبقة
- خارج تعريف الفئة
إذا كان من المقرر تعريف دالة خارج تعريف فئة، فيجب علينا استخدام عامل حل النطاق (::). ويجب أن يكون هذا مصحوبًا بأسماء الفئة والوظيفة.
مثال 4
#include <iostream> #include <string> using namespace std; class Guru99 { public: string tutorial_name; int id; void printname(); void printid() { cout << "Tutorial id is: "<< id; } }; void Guru99::printname() { cout << "Tutorial name is: " << tutorial_name; } int main() { Guru99 guru99; guru99.tutorial_name = "C++"; guru99.id = 1001; guru99.printname(); cout << endl; guru99.printid(); return 0; }
الإخراج:
فيما يلي لقطة شاشة للكود:
Code التفسير:
- قم بتضمين ملف رأس iostream في برنامجنا لاستخدام وظائفه.
- قم بتضمين ملف رأس السلسلة في برنامجنا لاستخدام وظائفه.
- قم بتضمين مساحة الاسم std في الكود الخاص بنا لاستخدام فئاتها دون استدعائها.
- قم بإنشاء فئة باسم Guru99.
- استخدم مُعدِّل الوصول العام لتمييز أعضاء الفئة الذين سنقوم بإنشائهم على أنهم متاحون للجمهور.
- قم بإنشاء متغير سلسلة باسم Tutorial_name.
- أنشئ متغيرًا صحيحًا باسم id.
- قم بإنشاء وظيفة باسم printname(). لم يتم تعريف هذه الوظيفة ضمن تعريف الفئة.
- أنشئ دالة باسم printid(). هذه الدالة مُعرّفة ضمن تعريف الصنف. وقد أُضيف جسمها ضمن تعريف الصنف.
- اطبع قيمة معرف المتغير بجانب النص الآخر على وحدة التحكم. لاحظ أنه تمت إضافة هذا داخل نص الدالة printid(). سيتم تنفيذه فقط عند استدعاء الدالة printid().
- نهاية نص الدالة printid().
- نهاية جسم الفئة Guru99.
- بداية تعريف الدالة printname() .
- قم بطباعة قيمة المتغير Tutorial_name على وحدة التحكم بجانب النص الآخر. لاحظ أنه تمت إضافة هذا داخل نص وظيفة printname(). سيتم تنفيذه فقط عند استدعاء الدالة printname().
- نهاية تعريف وظيفة printname().
- استدعاء الدالة الرئيسية (). يجب إضافة منطق البرنامج داخل نص هذه الوظيفة.
- أنشئ نسخة من الفئة Guru99 وأطلقوا عليه اسم guru99.
- استخدم المثال أعلاه لتعيين قيمة C++ إلى المتغير Tutorial_name.
- استخدم مثيل guru99 لتعيين قيمة 1001 لمعرف المتغير.
- استخدم المثيل guru99 لاستدعاء الدالة printname() .
- اتصل بأمر النهاية (سطر النهاية) لطباعة سطر فارغ جديد على وحدة التحكم.
- استخدم المثيل guru99 لاستدعاء الدالة printid().
- يجب أن يقوم البرنامج بإرجاع القيمة عند اكتماله بنجاح.
- نهاية نص الدالة main().
يتم تشغيل دالتين عضويتين خاصتين تلقائيًا عند إنشاء كائن وعند تدميره.
البنائين والمدمرين
ما هو المنشئ؟
الدوال البانية هي دوال خاصة تقوم بتهيئة الكائنات. C++ المجمعين يتم استدعاء الدالة البانية عند إنشاء كائن. تساعد الدوال البانية في إسناد قيم لأعضاء الفئة، وذلك بعد تخصيص مساحة ذاكرة لهم.
ما هو المُدمِّر؟
من ناحية أخرى، تساعد المدمرات في تدمير كائنات الفئة.
يجب أن يكون اسم المنشئ مشابهًا لاسم الفئة. ليس لدى المنشئين نوع إرجاع.
يمكن تعريف المنشئ داخل أو خارج نص الفصل. إذا تم تعريفه خارج نص الفصل، فيجب تعريفه باستخدام اسم الفصل وعامل حل النطاق (::).
مثال 5
#include <iostream> using namespace std; class ClassA { public: ClassA() { cout << "Class constructor called"<<endl; } ~ClassA() { cout << "Class destructor called"<<endl; } }; int main() { ClassA a; int p = 1; if (p) { ClassA b; } }
الإخراج:
فيما يلي لقطة شاشة للكود:
Code التفسير:
- قم بتضمين ملف رأس iostream في الكود لاستخدام وظائفه.
- قم بتضمين مساحة الاسم std في الكود الخاص بنا لاستخدام فئاتها دون استدعائها.
- قم بإنشاء فئة تسمى ClassA.
- استخدم معدّل الوصول العام لتحديد العضو الذي نحن على وشك إنشائه على أنه يمكن الوصول إليه بشكل عام.
- إنشاء منشئ للفئة.
- النص الذي سيتم طباعته على وحدة التحكم عند استدعاء المنشئ. النهاية هي أ C++ الكلمة الأساسية، والتي تعني خط النهاية. يقوم بنقل مؤشر الماوس إلى السطر التالي.
- نهاية نص منشئ الفصل.
- إنشاء مدمر للفئة.
- النص الذي سيتم طباعته على وحدة التحكم عند استدعاء أداة التدمير. النهاية هي أ C++ الكلمة الأساسية، والتي تعني خط النهاية. يقوم بنقل مؤشر الماوس إلى السطر التالي.
- نهاية جسد المدمر.
- نهاية الجسم الصفي.
- استدعاء الدالة الرئيسية (). يجب إضافة منطق البرنامج داخل نص هذه الوظيفة.
- قم بإنشاء كائن فئة وأعطه الاسم أ. سيتم استدعاء المنشئ.
- قم بإنشاء متغير عدد صحيح يسمى p وقم بتعيين القيمة 1 له.
- قم بإنشاء كتلة عبارة if باستخدام المتغير p.
- قم بإنشاء كائن فئة وأعطه الاسم ب. سيتم استدعاء المدمر.
- نهاية نص عبارة if.
- نهاية نص الدالة main().








