الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

اختبر قدراتك في C/CPP - الحلقة الرابعة, الجزء السادس

مغلق
بدأه Snack3r في 12 سبتمبر 2012 · 3 رد · 609 مشاهدة · في اختبر قداراتك
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

الحلقة الأولى.

الحلقة الثانية - الجزء الأول.

الحلقة الثانية - الجزء الثاني.

الحلقة الثانية - الجزء الثالث.

الحلقة الثانية - الجزء الرابع.

الحلقة الثانية - الجزء الخامس.

الحلقة الثانية - الجزء السادس و الأخير.

الحلقة الثالثة - الجزء الأول.

الحلقة الثالثة - الجزء الثاني.

الحلقة الثالثة - الجزء الثالث.

الحلقة الثالثة - الجزء الرابع.

الحلقة الثالثة - الجزء الخامس و الأخير.

الحلقة الرابعة - الجزء الأول.

الحلقة الرابعة - الجزء الثاني.

الحلقة الرابعة - الجزء الثالث.

الحلقة الرابعة - الجزء الرابع.

الحلقة الرابعة - الجزء الخامس.

مرحبا بكم إخوتي الكرام في الجزء السادس من الحلقة الرابعة من سلسلة اختبر قدراتك, قمتُ بتقسيم الحلقة الرابعة إلى عدة أجزاء, مُرتبة حسب الصعوبة.

أجزاء هذه الحلقة ستكون خاصة بمسائل الــ OOP.

الإختبار الرابع (الجزء السادس) :

1. خمن مُخرجات الكود التالي : (يُمنع استخدام الــ Compiler)

#include <iostream>
using namespace std;

class point {
    int x, y;
public:

    point(int abs = 0, int ord = 0) // constructeur 0, 1 ou 2 arguments
    {
        x = abs;
        y = ord;
        cout << "$$ construction point : " << x << " " << y << endl;
    }
    friend point operator +(point, point); // point + point --> point

    void affiche() {
        cout << "Coordonnées : " << x << " " << y << endl;
    }
};

point operator+(point a, point b) {
    point r;
    r.x = a.x + b.x;
    r.y = a.y + b.y;
    return r;
}

int main() {
    point a, b(2, 4);

    a = b + 6; // affectation 1
    a.affiche();

    a = 6 + b; // affectation 2
    b.affiche();

    return 0;
}

2. نفس السؤال باعتبار أنه تمت إعادة تعريف المؤثر + كدالة عضو (Member function) و ليس دالة صديقة (Friend function) ؟

3. نفس السؤال باعتبار أنه تمت إعادة تعريف المؤثر + هكذا :

friend point operator + (point &, point &) ;

4. نفس السؤال باعتبار أنه تمت إعادة تعريف المؤثر + هكذا :

friend point operator + (const point &, const point &) ;

سأضع حل السؤال بعد إنتهاء عرض المحاولات.

#2

1- المخرجات

$$ construction point : 0 0

$$ construction point : 2 4

Coordonnées : 8 4

Coordonnées : 8 4

أظن ان بقية الحالات نفس المخرجات

[سبحان الله و بحمده, سبحان الله العظيم]

#3

a. تبسيط العبارة b + 6 يحدث باستخدام المؤثر + الذي تمت إعادة تعريفه في الفئة point, يتم إسناد ناتج العبارة إلى a بعد تحويل العدد 6 إلى كائن من نوع point عن طريق استدعاء دالة البناء بوسيط واحد مما يعني أن الوسيط الثاني سيحتفظ بقيمته الإفتراضية.

العبارة الثانية يتم التعامل معها أيضا بنفس الطريقة السابقة (تحويل 6 إلى point).

في النهاية, سنحصل على المُخرجات التالية :

$$ construction point : 0 0

$$ construction point : 2 4

$$ construction point : 6 0

$$ construction point : 0 0

Coordonnées : 8 4

$$ construction point : 6 0

$$ construction point : 0 0

Coordonnées : 2 4

b. من ناحية أخرى, إذا أُعيد تعريف المؤثر + كدالة عضو, سيتم رفض العبارة الثانية أثناء ترجمة البرنامج, لأنه سيتم تفسيرها هكذا :

.operator + (b)

و بالتالي نلاحظ أن الدالة الصديقة هي الوحيدة التي يمكنها معالجة المعاملات الموجودة على طرفي مؤثر الجمع خصوصاً فيما يتعلق بالتحويل الضمني بين الأنواع.

c. الإرسال بالمرجع يتطلب أن يكون الوسيط المُرسل من نفس نوع الوسيط الأصلي للدالة و هذا ما لم يحصل, و بالتالي ستحدث أخطاء في ترجمة العبارتين أثناء تصريف البرنامج.

d. وجود const يسمح للمترجم بإرسال كائنات مؤقتة إلى الدالة operator +, يتم الحصول على الكائنات المؤقتة عن طريق عدة تحويلات للوسائط المُرسلة. و بالتالي العبارة الأولى و الثانية صحيحتان.

هذا الموضوع مغلق.

مواضيع مشابهة