مقدمة لفئات وكائنات C ++

click fraud protection

01

من 09

بدء فئات C ++

يد الكتابة على الكمبيوتر المحمول
سام إدواردز / غيتي إيماجز

شاء هي الفرق الأكبر بين C ++ و C. أحد الأسماء الأولى لـ C ++ كانت C مع Classes.

الطبقات والكائنات

الفئة هي تعريف للكائن. انها نوع تماما مثل الباحث. الطبقة تشبه أ هيكل مع اختلاف واحد فقط: جميع أعضاء الهيكل عامة بشكل افتراضي. جميع أعضاء الفصول خاصون.

تذكر - الفئة هي نوع ، والكائن في هذه الفئة هو مجرد متغير.

قبل أن نتمكن من استخدام كائن ، يجب إنشاؤه. أبسط تعريف للفصل هو:

 اسم الفصل

 // أفراد

 }


هذه الفئة المثال أدناه نماذج كتاب بسيط. يتيح لك استخدام OOP تجريد المشكلة والتفكير فيها وليس فقط المتغيرات التعسفية.

 // مثال واحد

 #تتضمن 

 #تتضمن 


 كتاب الصف

 {

 عدد الصفحات

 Int CurrentPage؛ 

 عامة:

 كتاب (Numpages) ؛ // البناء

 ~ Book () {}؛ // المدمر

 void SetPage (int PageNumber)؛

 الباحث GetCurrentPage (باطل) ؛

 }; 


 كتاب:: كتاب (int NumPages) {

 PageCount = NumPages؛

 }


 كتاب باطل:: SetPage (int PageNumber) {

 CurrentPage = PageNumber؛

 }


 int Book:: GetCurrentPage (void) {

 عودة CurrentPage ؛

 }


 انت مين() {

 كتاب ABook (128) ؛

 كتاب. SetPage (56) ؛

 الأمراض المنقولة جنسيا:: cout << "الصفحة الحالية" << ABook. GetCurrentPage () << std:: endl؛

 عودة 0 ؛

 }


instagram viewer

كل رمز من كتاب الصف وصولا الى int Book:: GetCurrentPage (void) { الوظيفة هي جزء من الفصل. ال الأساسية() وظيفة هناك لجعل هذا تطبيق runnable.

02

من 09

فهم فئة الكتاب

في ال الأساسية() تعمل متغير ABook من نوع كتاب يتم إنشاؤه بقيمة 128. بمجرد أن يصل التنفيذ إلى هذه النقطة ، يتم إنشاء الكائن ABook. في السطر التالي الطريقة كتاب. SetPage () يسمى والقيمة 56 المعينة إلى متغير الكائن كتاب. الصفحه الحاليه. ثم كوت مخرجات هذه القيمة عن طريق استدعاء كتاب. GetCurrentPage () طريقة.

عندما يصل التنفيذ عودة 0 ؛ لم يعد هناك حاجة إلى كائن ABook بواسطة التطبيق. ينشئ المحول البرمجي استدعاء إلى destructor.

إعلان الفصول

كل شيء بين كتاب الصف و ال } هو إعلان الفصل. تحتوي هذه الفئة على عضوين خاصين ، كلاهما من النوع int. هذه خاصة لأن الوصول الافتراضي لأعضاء الفصل خاص.

ال عامة: التوجيه يحكي مترجم الذي يصل من هنا هو عام. بدون ذلك ، سيظل خاصًا ويمنع الأسطر الثلاثة في الوظيفة الرئيسية () من الوصول إلى أعضاء Abook. حاول التعليق على عامة: خط خارج وإعادة ترجمة لمشاهدة الأخطاء ترجمة التي تلت ذلك.

هذا السطر أدناه يعلن منشئ. هذه هي الوظيفة التي تسمى عند إنشاء الكائن لأول مرة.

 كتاب (Numpages) ؛ // البناء 

يطلق عليه من الخط

 كتاب ABook (128) ؛ 

يؤدي هذا إلى إنشاء كائن يسمى ABook of type Book ويستدعي الدالة Book () باستخدام معامل 128.

03

من 09

المزيد عن فئة الكتاب

في C ++ ، يكون المنشئ دائمًا يحمل نفس اسم الفئة. يتم استدعاء المنشئ عند إنشاء الكائن والمكان الذي يجب أن تضع فيه الكود لتهيئة الكائن.

في كتاب السطر التالي بعد المنشئ المدمر. هذا له نفس اسم المنشئ ولكن مع علامة (tilde) أمامه. أثناء تدمير كائن ما ، يتم استدعاء المدمر لترتيب الكائن والتأكد من تحرير موارد مثل الذاكرة وملف الملف المستخدم من قبل الكائن.

تذكر- فئة xyz لها دالة مُنشئ xyz () ووظيفة المدمر ~ xyz (). حتى لو لم تعلن ، فإن المترجم سيضيفهم بصمت.

يتم استدعاء destructor دائمًا عند إنهاء الكائن. في هذا المثال ، يتم تدمير الكائن ضمنيًا عندما يخرج عن نطاقه. لمشاهدة هذا ، قم بتعديل إعلان destructor إلى هذا:

 ~ Book () {std:: cout << "Destructor يسمى"؛}؛ // المدمر 

هذه هي وظيفة مضمنة مع رمز في الإعلان. هناك طريقة أخرى للتضمين هي إضافة الكلمة المضمنة

 مضمنة ~ Book () ؛ // المدمر


وإضافة destructor كدالة مثل هذا.

 كتاب مضمن:: ~ كتاب (باطل) { 

 الأمراض المنقولة جنسيا:: cout << "Destructor يسمى"؛

 }


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

04

من 09

طرق الكتابة الصفية

افضل تمرين للكائنات هو جعل جميع البيانات خاصة والوصول إليها من خلال الوظائف المعروفة باسم وظائف الوصول. SetPage () و GetCurrentPage () هي الدالتين المستخدمة للوصول إلى متغير الكائن الصفحه الحاليه.

غير ال صف دراسي إعلان لهيكلة وإعادة ترجمة. يجب أن لا يزال ترجمة وتشغيل بشكل صحيح. الآن المتغيرين عدد الصفحات و الصفحه الحاليه متاحة للجمهور. أضف هذا السطر بعد Book ABook (128) ، وسيتم تجميعه.

 كتاب. PageCount = 9 ؛


إذا قمت بتغيير الهيكل مرة أخرى إلى صف دراسي وإعادة ترجمة ، هذا السطر الجديد لن يعد تجميع عدد الصفحات هي الآن خاصة مرة أخرى.

و:: تدوين

بعد النص الأساسي لإعلان فئة الكتاب ، هناك التعريفات الأربعة لوظائف الأعضاء. يتم تعريف كل منها بالبادئة Book:: لتعريفها على أنها تنتمي إلى تلك الفئة.:: تسمى معرف النطاق. يحدد الوظيفة باعتبارها جزءًا من الفصل. هذا واضح في إعلان الفصل ولكن ليس خارجه.

إذا كنت قد أعلنت عن وظيفة عضو في الفصل ، فيجب عليك توفير نص الوظيفة بهذه الطريقة. إذا كنت تريد استخدام فئة الكتاب في ملفات أخرى ، فيمكنك نقل إعلان الكتاب إلى قسم منفصل رأس ملف ، ربما يسمى book.h. ثم يمكن لأي ملف آخر تضمينه مع

 # تضمين "book.h" 

05

من 09

الوراثة وتعدد الأشكال

هذا المثال سوف يثبت الميراث. هذا هو تطبيق صنف اثنين مع فئة واحدة مشتقة من أخرى.

 #تتضمن 

 #تتضمن 


 الطبقة نقطة

 {


 int x، y؛

 عامة:

 نقطة (int atx ، int aty) ؛ // البناء

 مضمنة الظاهري ~ نقطة () ؛ // المدمر

 رسم باطل افتراضي () ؛

 }; 


 دائرة الصف: نقطة العامة


 نصف قطرها كثافة العمليات ؛

 عامة:

 دائرة (int atx ، int aty ، int theRadius) ؛

 مضمنة الظاهري ~ دائرة () ؛

 رسم باطل افتراضي () ؛

 };



 نقطة:: نقطة (int atx ، int aty) {

 س = atx ؛

 y = aty

 }


 مضمنة نقطة:: ~ نقطة (باطلة) { 

 الأمراض المنقولة جنسيا:: cout << "Point Destructor يسمى"؛

 }


 باطلة نقطة:: التعادل (باطلة) {

 std:: cout << "Point:: Draw point at" << x << "" << y << std:: endl؛

 }



 الدائرة:: الدائرة (int atx ، int aty ، int theRadius): Point (atx، aty) {

 نصف القطر = theRadius؛

 }


 المضمنة دائرة:: ~ Circle () {

 الأمراض المنقولة جنسيا:: cout << "Circle Destructor يسمى" << std:: endl؛

 }


 دائرة باطلة:: Draw (void) {

 نقطة:: التعادل () ؛

 std:: cout << "circle:: Draw point" << "Radius" << radius << std:: endl؛

 }


 انت مين() {

 دائرة الدائرة (10،10،5) ؛

 دائرة. رسم() ؛

 عودة 0 ؛

 }


المثال له فئتان ، نقطة ودائرة ، نمذجة نقطة ودائرة. نقطة لديها إحداثيات س وص. مشتق الفئة Circle من فئة Point ويضيف دائرة نصف قطرها. كل الطبقات تشمل أ رسم() وظيفة عضو. لإبقاء هذا المثال قصيرًا ، يكون النص مجرد نص.

06

من 09

ميراث

الطبقة دائرة مشتق من نقطة صف دراسي. يتم ذلك في هذا الخط:

 دائرة الصف: نقطة {


لأنه مستمد من فئة أساسية (Point) ، يرث Circle جميع أعضاء الفصل.

 نقطة (int atx ، int aty) ؛ // البناء

 مضمنة الظاهري ~ نقطة () ؛ // المدمر

 رسم باطل افتراضي () ؛


 دائرة (int atx ، int aty ، int theRadius) ؛

 مضمنة الظاهري ~ دائرة () ؛

 رسم باطل افتراضي () ؛


فكر في فئة الدائرة بصفتها فئة Point مع عضو إضافي (نصف قطر). يرث دالات عضو الفئة الأساسية والمتغيرات الخاصة س و ذ.

لا يمكن تعيينها أو استخدامها باستثناء ضمنيا لأنها خاصة ، لذلك يجب عليها القيام بذلك من خلال قائمة Initializer الخاصة ببناء Circle. هذا شيء يجب أن تقبله كما هو الآن. سأعود إلى قوائم مهيئ البرنامج التعليمي في المستقبل.

في دائرة البناء ، من قبل نصف القطر تم تعيينه إلى نصف القطر، يتم إنشاء جزء نقطة من الدائرة من خلال استدعاء منشئ نقطة في قائمة مهيئ. هذه القائمة هي كل شيء بين: و {أدناه.

 الدائرة:: الدائرة (int atx ، int aty ، int theRadius): Point (atx، aty) 


بالمناسبة ، يمكن استخدام تهيئة المنشئ لجميع الأنواع المدمجة.

 int a1 (10) ؛

 كثافة العمليات a2 = 10 ؛


كلاهما يفعل الشيء نفسه.

07

من 09

ما هو تعدد الأشكال؟

تعددية الأشكال مصطلح عام يعني "العديد من الأشكال". في C ++ أبسط شكل من أشكال تعدد الأشكال هو الحمولة الزائدة للوظائف. على سبيل المثال ، دعا العديد من الوظائف SortArray (arraytype) حيث قد يكون sortarray مجموعة مصفوفة من النمل أو الزوجي.

نحن مهتمون فقط في شكل تعدد الأشكال OOP هنا ، على الرغم من. يتم ذلك عن طريق إجراء دالة (مثل Draw ()) افتراضية في الفئة الأساسية نقطة ثم تجاوزه في فئة مشتقة دائرة.

على الرغم من أن وظيفة رسم() هو الظاهري في الفئة المشتقة دائرةهذا ليس ضروريًا بالفعل - إنه مجرد تذكير لي بأن هذا أمر افتراضي. إذا كانت الوظيفة في فئة مشتقة تتطابق مع وظيفة افتراضية في الفئة الأساسية في أنواع الاسم والمعلمة ، فستكون ظاهرية تلقائيًا.

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

08

من 09

C ++ البنائين

البنائين

المُنشئ هو وظيفة تقوم بتهيئة أعضاء الكائن. يعرف المنشئ فقط كيفية بناء كائن من فئته.

لا يتم توريث المنشئات تلقائيًا بين الطبقات الأساسية والفئات المشتقة. إذا لم تقم بتوفير واحد في الفئة المشتقة ، فسيتم توفير افتراضي ولكن هذا قد لا يفعل ما تريد.

إذا لم يتم توفير أي مُنشئ ، فسيتم إنشاء واحد افتراضي بواسطة المترجم دون أي معلمات. يجب أن يكون هناك دائمًا مُنشئ ، حتى لو كان الافتراضي وفارغًا. إذا قمت بتزويد مُنشئ بمعلمات ، فلن يتم إنشاء افتراضي.

بعض النقاط عن الصانعين:

  • المنشئات هي مجرد وظائف تحمل نفس اسم الفصل.
  • تهدف المنشئات إلى تهيئة أعضاء الفصل عند إنشاء مثيل لتلك الفئة.
  • لا يتم استدعاء البنائين مباشرة (إلا من خلال قوائم مُهيئ)
  • البنائين ليست افتراضية أبدا.
  • يمكن تعريف مُنشئات متعددة للفئة نفسها. يجب أن يكون لديهم معايير مختلفة لتمييزها.

هناك الكثير لمعرفة المزيد عن المنشئات ، على سبيل المثال ، المنشئات الافتراضية ، الواجب ، ونسخ المنشئات. هذه سوف تناقش في الدرس القادم.

09

من 09

ترتيب حتى C ++ المدمرات

destructor هي وظيفة عضو في الفصل لها نفس اسم المنشئ (والفئة) ولكن مع ~ (tilde) في المقدمة.

 ~ الدائرة () ؛


عندما يخرج كائن عن نطاقه أو نادراً ما يتم تدميره بشكل صريح ، يتم استدعاء المدمر الخاص به. على سبيل المثال ، إذا كان الكائن يحتوي على متغيرات ديناميكية مثل المؤشرات ، فحينئذٍ يجب تحرير تلك العناصر ويكون المدمر هو المكان المناسب.

على عكس المنشئات ، يمكن ويجب أن تكون المدمرات ظاهرية إذا كنت قد اشتقت فئات. في ال نقطة و دائرة مثال على ذلك ، ليست هناك حاجة إلى destructor حيث لا يوجد عمل تنظيف يجب القيام به (إنه مجرد مثال). هل كان هناك متغيرات أعضاء ديناميكية (مثل مؤشرات) عندها سيتطلب هؤلاء التحرير لمنع تسرب الذاكرة.

أيضا ، عندما تضيف الفئة المشتقة أعضاء تتطلب تنظيمًا ، ستكون هناك حاجة إلى مدمرات افتراضية. عندما تكون افتراضية ، يُطلق على مُدمّر الفئة الأكثر اشتقاقًا أولاً ، ثم يُسمى مُدمِّر أسلافه المباشرين ، وهكذا يصل إلى الفئة الأساسية.

في مثالنا ،

 ~ الدائرة () ؛

ثم

 ~ نقطة () ؛


فئات قاعدة destructor يسمى الأخير.

هذا يكمل هذا الدرس. في الدرس التالي ، تعرف على المنشئات الافتراضية ونسخ المنشئات والمهمة.

instagram story viewer