المشاركات

عرض الرسائل ذات التصنيف خصائص متقدمة في سي بلس بلس

ملخص خصائص متقدمة في السي ++

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

إيجاد فئة كائن في ++C

صورة
إيجاد فئة كائن أحيانا ما نحتاج لبيان الفئة التي ينتمي إليها كائن ما . وقد تتعجب من احتمال أن ينسي مبرمج انتماء كائنات برنامجه , ولكن عجبك يزول حين تفكر في حالة مصفوفة من مؤشرات تشير لأنواع مختلفة من الكائنات , كما في برنامجنا virtpers.cpp الذي عرضناه في هذا الفصل . كيف نعرف أية فئة ينتمي إليها الكائن المشار إليه ؟ لحسن الحظ تحتوي الإصدارات الجديدة من السي ++ علي دالة تسمي typeid() تمكننا من الحصول علي هذه المعلومة , وتسمي هذه العملية run time type identification (RTTI) أي التعرف علي النوع أثناء التشغيل . وإليك برنامجا يطبق هذه الفكرة . typeid.cpp   // typeid.cpp // demonstrates typeid() function #include <iostream.h> #include <typeinfo.h> // for typeid()   class ClassA { };   class ClassB { };   void main() { ClassA ObjA; ClassB ObjB;   if ( typeid(ObjA) == typeid(ClassA) ) cout << "\nObjA is an object of ClassA" ; else cout << "...

المؤشر this في ++C

صورة
المؤشر this لكل دالة منتمية لفئة ما اتصال بمؤشر خفي يسمي المؤشر this يحتوي علي عنوان الكائن الذي ينشأ من هذه الفئة , بحيث يمكن علي الدوام معرفة موضع أي كائن من الذاكرة ولبيان ذلك نقدم لك برنامجا صغيرا يظهر دور هذا المؤشر .   where .cpp   // where.cpp // the this pointer #include <iostream.h>   class where { private : char charray[10]; // occupies 10 bytes public : void reveal() { cout << "\nMy object's address is " << this ; } };   void main() { where w1, w2, w3; // make three objects w1.reveal(); // see where they are w2.reveal(); w3.reveal(); } تنشئ الدالة الأصلية ثلاثة كائنات من الفئة where ثم تسأل من كل كائن أن يعلن عن عنوانه , باستخدام دالته reveal () وحيث إن عنصر البيانات في الكائن (الذي لم نستخدمه ) هو مصفوفه من 10 محارف , فإن الكائنات تكون متباعدة بمقدار 10 بايتات ] يمكن حساب الفرق بين العناوين بعد تحويلها للنظام العشري [ . الوصول إلي عنصر للكائن حينما تستدعي دالة منتمية , فإ...

استهلال التخصيص والنسخ في ++C

صورة
استهلال التخصيص والنسخ إن محول الصياغة في لغة السي ++ مشغول علي الدوال بالنيابة عنك , للقيام بمهام يعفيك من أن تشغل نفسك بها . فإذا توليتها بنفسك , فسوف ينصاع لك , أما لو تركتها له , فينجزها بطريقته . ويعتبر مؤثر التخصيص وبادئة النسخ مثالين لهذا الوضع . لقد استخدمنا مؤثر التخصيص مرارا دون أن نشغل بالنا به . فإذا كان لدينا كائنين a1,a2 ولم نأمر المترجم بشئ أخر , فإنه سوف ينفذ العبارة : A2=a1; ينسخ بيانات الكائن a1 في عنصر بيانات الكائن a2 إن هذا هو العمل التلقائي للمؤثر = . كما أننا علي معرفة بعملية استهلال الكائنات , وإن استهلال كائن بكائن أخر , علي غرار العبارة : Alpha a2(a1); تفعل نفس الشئ فيقوم المترجم بإنشاء كائن a2 من الفئة alpha وينسخ فيه بيانات الكائن a1 هذا هو العمل التلقائي للبادئة . هذان العملان التلقائيان يقوم بهما المترجم بلا مقابل . فإذا كان النسخ عنصرا فعنصر هو ما تبتغيه فليس مطلوبا منك القيام بأي شئ . أما لو كانت إرادتك منصرفة لشئ أكثر تعقيدا فلك أن تتجاوز هذه الأعمال التلقائية . وسوف نشرح طريقة زيادة تحميل مؤثر التخصيص وبادئة النسخ كلا علي حدة , ثم نجم...

الدوال الاستاتيكية في ++C

صورة
الدوال الاستاتيكية قدمنا لنوع البيانات static في البرنامج static سابقا وقلنا إنها بيانات لا تنسخ لكل كائن , بل تكون مشتركة لكافة الكائنات . وقد قدمنا في البرنامج مثالا لفئة تتابع عدد كائناتها . سوف نتوسع في هذا المفهوم بتقديم الدوال الاستاتيكية عبرة بالبيانات , وسوف يتضمن برنامجنا نموذجا لفئة تحمل رقم هوية , وهو ما يعطيك إمكانية أن تسأل كل كائن عن رقم هويته , ولهذا الإمكانية تطبيقات كثرة , خاصة في برامج تتبع وتصحيح البرامج . statfunc.cpp   // statfunc.cpp // static functions and ID numbers for objects // UCS Laboratories   #include <iostream.h>   class gamma { private : static int total; // total objects of this class // (declaration only) int id; // ID number of this object public : gamma() // no-argument constructor { total++; // add another object id = total; // id equals current total ...

الدوال الصديقة في ++C

صورة
الدوال الصديقة يقتضي مفهوم الكبسلة وإخفاء البيانات ألا تستطيع دالة الاتصال ببيانات كائن غير منتمية للفئة المنتمي إليها (إذا كانت معرفة private ) فالمبدأ العام : إذا لم تكن منتميا , فأنت ممنوع من الاتصال . علي أنه قد تثور مواقف يكون فيها هذا التحديد الصارم غير ملائم . الأصدقاء هم الصلة لنفرض أنك تريد لدالة أن تتعامل في نفس الوقت مع بيانات كائنين منتمين لفئتين مختلفتين , في موقف كهذا ليس غير دالة صديقة friend function تقوم بدور صلة بين الكائنين . وإليك يطبق هذه الفكرة . friend.cpp   // friend.cpp // friend functions #include <iostream.h>   class beta; // needed for frifunc declaration   class alpha { private : int data; public : alpha() { data = 3; } // no-arg constructor friend int frifunc(alpha, beta); // friend function };   class beta { private : int data; public : beta() { data = 7; } // no-arg constructor...