منتدى طلاب جامعة الحديدة

أخي الزائر إن لم تكن عضواً في المنتدى فنحن ندعوك لكي تنظم إلينا وشكراً تحيات مدير المنتدى طارق البغوي

انضم إلى المنتدى ، فالأمر سريع وسهل

منتدى طلاب جامعة الحديدة

أخي الزائر إن لم تكن عضواً في المنتدى فنحن ندعوك لكي تنظم إلينا وشكراً تحيات مدير المنتدى طارق البغوي

منتدى طلاب جامعة الحديدة

هل تريد التفاعل مع هذه المساهمة؟ كل ما عليك هو إنشاء حساب جديد ببضع خطوات أو تسجيل الدخول للمتابعة.
منتدى طلاب جامعة الحديدة


4 مشترك

    الدوال الصديقه

    عبد الواسع عمر الرمانه
    عبد الواسع عمر الرمانه
    طالب لا يضاها
    طالب لا يضاها


    ذكر
    عدد الرسائل : 1299
    العمر : 38
    البلد : اليمن
    القسم والمستوى : أستاد حاسوب
    المزاج : عسل+سكرزياده
      : الدوال الصديقه 15781610
    السٌّمعَة : 5
    نقاط : 430
    تاريخ التسجيل : 14/10/2007

    بطاقة الشخصية
    تخصصي: حاسوب
    المحافظة: الحديدة

    الدوال الصديقه Empty الدوال الصديقه

    مُساهمة من طرف عبد الواسع عمر الرمانه الأحد مارس 01, 2009 9:50 pm

    ** الأصناف الصديقة Friend Classes :
    الدوال الصديقه Fa9l


    تعريف : هو عبارة عن صنف تستطيع كل دواله الأعضاء أن تستخدم خصائص الصنف الآخر
    -
    وللتصريح عن الصنف الصديق : نستخدم الكلمة المفتاحية friend مثلاً لجعل الصنف tow صديق للصنف one نكتب العبارة التالية :
    كود
    Friend class tow
    داخل الصنف one .

    ملاحظات :
    1-
    يمكن التصريح عن الصنف الصديق بأي موضع داخل الآخر .
    2-
    علاقة الصداقة ليست تناظرية ، بمعنى إذا كان الصنف A صديق للصنف B فهذا لا يعني أن الصنف B صديق للصنف A .
    3-
    علاقة الصداقة ليست متعدية ، بمعنى إذا كان الصنف A صديق للصنف B والصنف B صديق للصنف C فهذا لا يعني أن الصنف A صديق للصنف C .
    مثال توضيحي :
    كود
    //
    تعريف للصنف فقط دون كتابة اي تفاصيل له
    class a;
    class b
    {
    /*
    كافة التفاصيل الخاصة بالـ class b
    */
    صنْف صديق
    ',CAPTION,'Friend Class',WRAP, TEXTFONTCLASS,'myText','purple');" onmouseout=nd(); href=""Friend Class a;
    }
    class a
    {
    /*
    كافة التفاصيل الخاصة بالـ class a
    */


    **
    مثال : برنامج يستخدم الأصناف الصديقة ، ويقوم بإيجاد الوسط الحسابي لـ N من الأعداد الحقيقية المدخلة من قبل المستخدم .بحيث
    *
    الصنف الأول يستخدم لـ ( إدخال الأعداد ثم اثجاد مجموعها والذي نسميه بـ summation ).
    *
    الصنف الثاني يستخدم المعلومات الموجودة في الصنف الأول summation ومن ثم إيجاد الوسط الحسابي والذي نسميه بـ mean ::..
    كود
    #include
    #include
    using
    حيّز الأسماء
    ',CAPTION,'Namespace',WRAP, TEXTFONTCLASS,'myText','purple');" onmouseout=nd(); href=""Namespace std;
    //
    تعريف الصنف الصديق أولاً
    class mean;
    class summation
    {
    //
    تم هنا تعريف الصنف الصديف داخل الصنف
    صنْف صديق
    ',CAPTION,'Friend Class',WRAP, TEXTFONTCLASS,'myText','purple');" onmouseout=nd(); href=""Friend Class mean;
    private:
    //
    المتغير الذي يحدد عدد الاعداد المدخلة من قبل المستخدم
    int n;
    float x,sum;
    public:
    //
    داله بناء
    summation()
    {sum=0;

    cout<<"Enter n :"<cin>>n;
    for(int i=1;i<=n;i++)
    {
    cout<<"Enter x ["<cin>>x;
    sum+=x;
    }
    cout<<"Summation="<}};
    class mean
    {
    private :
    //
    متغير عدد حقيقي لتخزين المتوسط
    float s;
    public:
    //
    لاحظ هنا الدالة لها وسيطة من نوع الكائن الصديق
    //
    من خلالة يتم الوصول لكافة الأعضاء الموجودة بداخله مثل مجموع الاعداد
    mean(summation ss)
    {
    s=ss.sum/ss.n;
    cout<<"Mean = "<}};
    int main()
    {
    //
    يتم هنا استدعاء دالة البناء مباشرة
    summation s;
    //
    لاحظ هنا الوسيطة هي الكائن s
    //
    لانه يحتفظ بكافة العمليات التي اجريناها
    mean m(s);
    system("PAUSE");
    return 0;
    }


    عبد الواسع عمر الرمانه
    عبد الواسع عمر الرمانه
    طالب لا يضاها
    طالب لا يضاها


    ذكر
    عدد الرسائل : 1299
    العمر : 38
    البلد : اليمن
    القسم والمستوى : أستاد حاسوب
    المزاج : عسل+سكرزياده
      : الدوال الصديقه 15781610
    السٌّمعَة : 5
    نقاط : 430
    تاريخ التسجيل : 14/10/2007

    بطاقة الشخصية
    تخصصي: حاسوب
    المحافظة: الحديدة

    الدوال الصديقه Empty رد: الدوال الصديقه

    مُساهمة من طرف عبد الواسع عمر الرمانه الأحد مارس 01, 2009 9:52 pm

    ** أعضاء الصنف الساكنة Static Class members :

    الدوال الصديقه Fa9l

    البيانات الساكنة : هي عبارة عن خصائص ( متغيرات ) مشتركة بين كل كائنات الصنف ، أي أن كل الكائنات لها نفس النسخة من المتغيرات .

    -
    وللتصريح عن البيانات الساكنة نستخدم المفتاحية static .



    *
    ملاحظات :
    1-
    لابد من تهيئة المتغيرات الساكنة لمرة واحدة فقط في البرنامج .

    2-
    يمكن الوصول للمتغيرات الساكنة العامة باستخدام اسم الصنف مع مؤثر دقة الوصولScope Resolution Operator ( :: ) ، أو باستخدام اسم الكائنات .
    مثلاً : ليكن لدينا الصنف Employee والذي يحمل المتغير الصحيح العام count لتهيئة هذا المتغير نكتب العبارة التالية :
    كود
    int Employee :: count=0;
    وللوصول لهذا المتغير في البرنامج الرئيسي نتبع أحد هاتين الطريقتين :
    كود
    Employee::count
    OR
    كود
    s.count
    حيث s كائن تم اشتقاقه من الصنف Employee .

    3-
    أي دالة تعامل مع بيانات ( متغيرات ) ساكنة لابد أن تكون ساكنة أيضاً . مثلاً
    كود
    static void display()
    {
    cout<}
    حيث count هو متغير ساكن والذي سبق تعريفة في الملاحظة السابقة .

    4-
    استدعاء الدالة الساكنة يتم باستخدام :
    أ. مؤثر دقة الوصول
    نِطاق
    ',CAPTION,'Scope',WRAP, TEXTFONTCLASS,'myText','purple');" onmouseout=nd(); href=""Scope Resolution Operator .
    ب. الكائنات .



    مثال على البيانات الساكنة

    كود
    #include
    #include
    using
    حيّز الأسماء
    ',CAPTION,'Namespace',WRAP, TEXTFONTCLASS,'myText','purple');" onmouseout=nd(); href=""Namespace std;
    class staticproperty
    {
    public:
    int static n;
    staticproperty()
    {
    ++n;
    }
    };
    int staticproperty::n=3;
    main()
    {
    staticproperty s1,s2,s3,s4;
    cout<cout<cout<system("PAUSE");

    }

    كماهو ملاحظ لدنيا المتغير الساكن وهو n تم تعريفه في بداية الصنف :
    كود
    int static n;

    ومن ثم لدينا دالة البناء التي تزيد قيمة المتغير n بالعدد ( 1 ) من خلال مؤثر التزايد كما يظهر :.
    كود
    staticproperty()
    {
    ++n;
    }

    بعد ذلك تم تطبيق أمر مهم جداً (ملاحظة رقم 1) وهو تهئية قيمة المتغير وهنا في هذا المثال جعلنا n=3 وتم التعريف خارج الصنف باستخدام مؤثر دقة الوصول Scope Resolution Operator :
    كود
    int staticproperty::n=3;

    بعد ذلك تم اشتقاق أربعة كائنات من الصنف staticproperty :
    كود
    staticproperty s1,s2,s3,s4;

    لاحظ هنا دالة البناء تزيد قيمة المتغيرn بـ ( 1) وتم تهيئة قيمة المتغير بالعدد ( 3) فعند اشتقاق اي كائن تزيد قيمة n باضافة العدد 1 إلي القيمة السابقة .
    فعند اشتقاق الكائن s1 أصبحت قيمة n تساوي العدد 4 .
    وعند اشتقاق الكائن s2 أصبحت قيمةn تساوي العدد 5 .
    وعند اشتقاق الكائن s6 أصبحت قيمةn تساوي العدد 6 .
    وعند اشتقاق الكائن s7 أصبحت قيمةn تساوي العدد 7 .
    وكما ذكرنا في التعريف الموجود في اول الرد
    إقتباس
    البيانات الساكنة : هي عبارة عن خصائص ( متغيرات ) مشتركة بين كل كائنات الصنف ، أي أن كل الكائنات لها نفس النسخة من المتغيرات .
    أي ان :
    كود
    s1 = s2 = s3 = s4
    وجميع الكائنات تساوي اخر عملية تمت على اي كائن وهي اشتقاق الكائن s4 زادت قيمة المتغير n وأصبحت تساوي العدد 7 ..
    أي عند طباعة أي كائن :.
    كود
    staticproperty s1,s2,s3,s4;
    cout<cout<cout<

    عبد الواسع عمر الرمانه
    عبد الواسع عمر الرمانه
    طالب لا يضاها
    طالب لا يضاها


    ذكر
    عدد الرسائل : 1299
    العمر : 38
    البلد : اليمن
    القسم والمستوى : أستاد حاسوب
    المزاج : عسل+سكرزياده
      : الدوال الصديقه 15781610
    السٌّمعَة : 5
    نقاط : 430
    تاريخ التسجيل : 14/10/2007

    بطاقة الشخصية
    تخصصي: حاسوب
    المحافظة: الحديدة

    الدوال الصديقه Empty رد: الدوال الصديقه

    مُساهمة من طرف عبد الواسع عمر الرمانه الأحد مارس 01, 2009 9:54 pm

    فستكون مخرجات هذا البرنامج هي ::
    7
    7
    7
    مثال (2) على الأعضاء ( الدوال ) الساكنة :
    كود
    #include
    #include
    using
    حيّز الأسماء
    ',CAPTION,'Namespace',WRAP, TEXTFONTCLASS,'myText','purple');" onmouseout=nd(); href=""Namespace std;
    class property
    {
    private:
    int static n;
    public:
    property ()
    {++n;}
    static void display()
    {
    cout<}};
    int property::n=2;
    int main()
    {
    property s1,s2,s3;
    property::display();

    s1.display();
    s3.display();
    system("PAUSE");
    return 0;
    }

    وهنا تم تعريف دالة display() على انها دالة ساكنة ::.
    كود
    static void display()
    {
    cout<}

    ومن ثم تم تهيئة قيمة المتغير n بالعدد ( 2 ) ::
    كود
    int property::n=2;
    بعدها تم اشتقاق الكائنات من الصنف property ::
    كود
    property s1,s2,s3;
    ونفس العملية في المثال الأول تتم هنا أيضاً .. حيث ان جميع الكائنات تحتوي على المتغير n الذي يساوي العدد ( 5 ) .
    بعد ذلك تمت طباعة المخرجات بطرق مختلفة كما هو ظاهر ::.
    كود
    property::display();

    s1.display();
    s3.display();
    حيث في هذه الحالة تكون المخرجات بـ :
    5
    5
    5

    تمرين : وضح مخرجات هذا البرنامج ( دون استخدام اي مترجم )
    كود
    #include
    #include
    class sample
    {
    public:
    int static n;
    sample()
    {
    ++n;
    }
    ~sample()
    {
    --n;
    }
    };
    int sample::n=5;
    main()
    {
    sample a;
    sample b[4];
    sample *c=new sample[3];
    cout< n<<"\n";
    cout<delete []c;
    cout<cout<system("PAUSE");
    return 0;
    }

    عبد الواسع عمر الرمانه
    عبد الواسع عمر الرمانه
    طالب لا يضاها
    طالب لا يضاها


    ذكر
    عدد الرسائل : 1299
    العمر : 38
    البلد : اليمن
    القسم والمستوى : أستاد حاسوب
    المزاج : عسل+سكرزياده
      : الدوال الصديقه 15781610
    السٌّمعَة : 5
    نقاط : 430
    تاريخ التسجيل : 14/10/2007

    بطاقة الشخصية
    تخصصي: حاسوب
    المحافظة: الحديدة

    الدوال الصديقه Empty رد: الدوال الصديقه

    مُساهمة من طرف عبد الواسع عمر الرمانه الأحد مارس 01, 2009 9:55 pm

    ** الدوال الخطية Inline Functions :
    الدوال الصديقه Fa9l

    الدوال الخطية : عبارة عن دوال تقوم بتسريع تنفيذ البرنامج (لان كل موعد يتم فيه استدعاء الدالة الخطية يقوم المترجم بكتابة التفاصيل في موقع الاستدعاء)، ويمكن توضيح استخدام الدالة الخطية في لغة An object-oriented programming langauge. It is the base of Java,C# programming languages.
    ',CAPTION,'C++',WRAP, TEXTFONTCLASS,'myText','purple');" onmouseout=nd(); href=""C++
    كما في المثال التالي :.
    كود
    #include
    #include
    using
    حيّز الأسماء
    ',CAPTION,'Namespace',WRAP, TEXTFONTCLASS,'myText','purple');" onmouseout=nd(); href=""Namespace std;
    inline int cube (int a)
    {
    return a*a*a;
    }
    int main()
    {
    for (int i=0;i<10;i++)
    {
    cout<}
    system("PAUSE");
    return 0;
    }

    وبنفس هذا الأسلوب يمكن استخدام مفهوم الدوال الخطية مع الأصناف Classes حيث :

    1-
    أي دالة تكتب تفاصيلها داخل الصنف يعتمد المترجم على أنها دالة خطية إلا إذا احتوت على حلقات تكرارية فيعتمد المترجم على أنها عادية .
    2-
    يقوم المترجم بكتابة تفاصيل الدالة الخطية في كل موضع يظهر فيه استدعاء الدالة الخطية مما يقلل من وقت الذهاب والرجوع للدالة .

    مثال :
    كود
    class xy
    {
    private :
    int g;
    public:
    void set (int x )
    {
    g=x;
    }
    };
    لاحظ هنا أن الدالة set تعتبر دالة خطية لسببين :
    1-
    تفاصيلها كتبت داخل الصنف .
    2-
    لا تحتوي على حلقات تكرارية .

    *
    إذا كتبت تفاصيل الدالة خارج الصنف لابد من إضافة inline إلى الدالة حتى تعتبر دالة خطية .

    مثال :
    كود
    #include
    #include
    using
    حيّز الأسماء
    ',CAPTION,'Namespace',WRAP, TEXTFONTCLASS,'myText','purple');" onmouseout=nd(); href=""Namespace std;
    class sample
    {
    int i,j,k;
    public:
    sample (int a,int b)
    {
    i=a;
    j=b;
    }
    //
    نكتب تفاصيل هذه الدالة خارج الصنف
    int divisible();
    };
    inline int sample::divisible()
    {
    //
    لا يوجد باقي للقسمة
    k=!(i%j);
    return k;
    }
    int main()
    {
    int x,y;
    cout<<"Enter X and Y \n";
    cin>>x>>y;
    sample s(x,y);
    if (s.divisible())
    cout<else
    cout<system("PAUSE");
    return 0;
    }

    هذا مثال بسيط يقوم بطلب أدخال عددين من المستخدم ومن ثم يوضح ماإذا أمكن تقسيم العدد الأول على الثاني أو لا ..
    ولكن الأهم ايضاحة هو الدالة الخطية حيث عرفنا داخل الصنف الدالة :
    كود
    int divisible();

    ومن ثم نكتب تفاصيل هذه الدالة خارج الصنف وذلك باستخدام مؤثر دقة الوصول
    نِطاق
    ',CAPTION,'Scope',WRAP, TEXTFONTCLASS,'myText','purple');" onmouseout=nd(); href=""Scope Resolution Operator وايضاً استخدمنا الكلمة المفتاحية inline كما يظهر هنا ::
    كود
    inline int sample::divisible()
    {
    //
    لا يوجد باقي للقسمة
    k=!(i%j);
    return k;
    }


    عبد الواسع عمر الرمانه
    عبد الواسع عمر الرمانه
    طالب لا يضاها
    طالب لا يضاها


    ذكر
    عدد الرسائل : 1299
    العمر : 38
    البلد : اليمن
    القسم والمستوى : أستاد حاسوب
    المزاج : عسل+سكرزياده
      : الدوال الصديقه 15781610
    السٌّمعَة : 5
    نقاط : 430
    تاريخ التسجيل : 14/10/2007

    بطاقة الشخصية
    تخصصي: حاسوب
    المحافظة: الحديدة

    الدوال الصديقه Empty رد: الدوال الصديقه

    مُساهمة من طرف عبد الواسع عمر الرمانه الأحد مارس 01, 2009 9:59 pm



    كل كائن يملك حق الوصول إلى عنوانه عن طريق مؤشر يدعى This .
    يُستخدم المؤشر This بشكل ضمني ليشير أن الأعضاء تنتمي إلى كائن معين ، ويمكن استخدام المؤشر This بشكل صريح .

    مثال :

    كود

    #include
    #include
    using

    حيّز الأسماء

    ',CAPTION,'Namespace',WRAP, TEXTFONTCLASS,'myText','purple');" onmouseout=nd(); href=""
    Namespace std;
    class test
    {
    private:
    int x;
    public:
    test ( int =0);
    void print()const;
    };
    test::test(int a)
    {
    x=a;
    }
    void test::print()const
    {
    cout<<"x = "<cout<<"This -> ="<x<cout<<"*this ="<<(*this).x<}
    int main()
    {
    test t(12);
    t.print();
    system("PAUSE");
    return 0;
    }
    ملاحظات :
    1- تم استخدام الدالة print() لطباعة قيمة المتغير x بشكل مباشر ، ثم بعد ذلك استخدمنا ترميزين مختلفين لطباعة x :
    أ. معامل السهم ( -> ) مع المؤشر This .
    ب. معامل النقطة ( . ) مع محتوى المؤشر ( *This ).

    2-
    تم استخدام الأقواس مع محتوى المؤشر This ( *This ) ، لأن عامل النقطة له أولوية أعلى على عامل المحتوى ( * ) .

    3-
    إذا لم يتم استخدام الأقواس مع محتوى المؤشر ( *This ) بحيث نضعها بهذا الشكل :
    كود

    *this.x
    فإنه يحدث خطأ قواعدي لأننا استخدمنا عامل النقطة مع المؤشر This .

    **
    وهنالك استخدام آخر ومهم جداً للمؤشر This وهو تفعيل الاستدعاء المتتالي للدوال **

    مثال : يبين هذا البرنامج إرجاع مرجع لكائن الصنف sample لتفعيل الاستدعاء المتتالي للدوال .

    كود

    #include
    #include
    using

    حيّز الأسماء

    ',CAPTION,'Namespace',WRAP, TEXTFONTCLASS,'myText','purple');" onmouseout=nd(); href=""
    Namespace std;
    class sample
    {
    public:
    int c;
    sample &cube(int);
    void show()
    {
    cout<<"Cube ="<}
    };
    sample &sample::cube (int a)
    {
    c = a*a*a;
    return *this;
    }
    int main()
    {
    sample s;
    s.cube(2).show();

    system("PAUSE");
    return 0;
    }

    هذا البرنامج طويل بعض الشيء .. سنشرح ماهو مهم .. :::

    كود

    sample &cube(int);
    هذا تعريف الدالة cube وهي لايجاد تكعيب أي عدد مدخل ( نوع الدالة مرجع كائن).
    كود

    sample &sample::cube (int a)
    {
    c = a*a*a;
    return *this;
    }
    int main()
    وهذا هو كتابة تفاصيل الدالة كتبناها خارج الصنف حيث ان كل القيم من الدالة تمثل محتوى المؤشر This .
    بعد ذلك والأهم وهو طريقة الاستدعاء المتتالي للدوال وهو كما ظهر في الدالة الرئيسية main().:
    كود

    sample s;
    s.cube(2).show();
    فكما هو ملاحظ تم اشتقاق الكائن s من الصنف sample ومن ثم تم استدعاء الدالتين cube والدالة show بشكل متتالي ..
    عبد الواسع عمر الرمانه
    عبد الواسع عمر الرمانه
    طالب لا يضاها
    طالب لا يضاها


    ذكر
    عدد الرسائل : 1299
    العمر : 38
    البلد : اليمن
    القسم والمستوى : أستاد حاسوب
    المزاج : عسل+سكرزياده
      : الدوال الصديقه 15781610
    السٌّمعَة : 5
    نقاط : 430
    تاريخ التسجيل : 14/10/2007

    بطاقة الشخصية
    تخصصي: حاسوب
    المحافظة: الحديدة

    الدوال الصديقه Empty رد: الدوال الصديقه

    مُساهمة من طرف عبد الواسع عمر الرمانه الأحد مارس 01, 2009 10:02 pm

    ** التحميل الزائد للمؤثرات Operator Overloading ::
    هو المقدرة على ربط مؤثر معين لدالة عضو في الصنف ويتم استدعاؤها عند تطبيق المؤثر على أحد كائنات الصنف .

    *
    فائدته : مؤثر الجمع ( + ) نستطيع أن نقوم بتطبيقه على عددين صحيحين أو حقيقيين ولكن لا نستطيع استخدامه مع الكائنات إلا بعد تحميله تحميلاً زائداً .

    ملاحظات :
    1-
    لا ينبغي تغيير وظيفة المؤثر عند تحميله . مثلاً إذا قمنا بتحميل مؤثر الجمع فلا ينبغي استخدامه مع عملية أخرى مثل ( - , * , / ) ، لأن هذا الاستخدام يعتبر استخدام سيء لمفهوم التحميل الزائد للمؤثرات ويجعل من الصعب فهمه .
    2-
    يمكن تحميل معظم المؤثرات الموجودة في لغة An object-oriented programming langauge. It is the base of Java,C# programming languages.
    ',CAPTION,'C++',WRAP, TEXTFONTCLASS,'myText','purple');" onmouseout=nd(); href=""C++
    بشكل زائد .
    3-
    نستخدم الكلمة المفتاحية Operator عند القيام بتحميل مؤثر تحميلاً زائداً .

    -
    والصيغة العامة لدالة التحميل الزائد للمؤثرات :
    كود
    datatype operator operatorSymbol ( Parameters)
    حيث :
    datatype =
    القيمة الراجعة من الدالة ( كائن ) .
    operator =
    وهي كلمة مفتاحية
    كلمة محجوزة
    ',CAPTION,'Keyword',WRAP, TEXTFONTCLASS,'myText','purple');" onmouseout=nd(); href=""Keyword .
    operatorSymbol =
    وهو رمز المؤثر ( + , * , ...)



    -
    المؤثرات التي يمكن تحميلها بشكل زائد في An object-oriented programming langauge. It is the base of Java,C# programming languages.
    ',CAPTION,'C++',WRAP, TEXTFONTCLASS,'myText','purple');" onmouseout=nd(); href=""C++
    وهي :
    كود
    ++ , -- //
    مؤثرات التزايد والتناقص
    + , - , * , / , ^ , % //
    المؤثرات الرياضية
    = //
    المساواة
    += , -= , *= , /= , ^= , %= //
    المؤثرات المركبة
    == , != , > , < , <= , >= //
    مؤثرات المقارنة
    && , || , ! //
    المؤثرات المنطقية
    new , delete , new[ ] , delete[ ] //
    المؤشرين newوdelete

    -
    المؤثرات التي لا يمكن تحميلها بشكل زائد :
    كود
    ?
    .
    ::
    ->

    *
    تعتبر محاولة تحميل أي مؤثر لا يمكن تحميله بشكل زائد خطأ قواعدي .
    *
    تحميل مؤثري الجمع والإسناد ( + , = ) لجعل هذه الجملة صحيحة
    كود
    object2= object2 + object1
    لا نستطيع أن نقوم بكتابة الجملة أعلاه بالشكل التالي :
    كود
    object2+=object1
    إلا بعد تحميل المؤثر += بشكل صريح .



    *
    مثال : على تحميل مؤثر التزايد ( ++ )
    كود
    #include
    #include
    using
    حيّز الأسماء
    ',CAPTION,'Namespace',WRAP, TEXTFONTCLASS,'myText','purple');" onmouseout=nd(); href=""Namespace std;
    class alpha
    {
    private:
    int a;
    public:
    alpha()
    {
    a=1;
    }
    alpha (int);
    void display();
    alpha operator++();
    };
    alpha::alpha(int a1)
    {
    a=a1;
    }
    void alpha::display()
    {
    cout<}
    alpha alpha::operator++()
    {
    ++this->a;
    return *this;
    }
    int main()
    {
    alpha a1,a2(12);
    a1.display();
    a2.display();
    ++a1;
    a1.display();
    ++a2;
    a2.display();
    alpha a3;
    a3=++a1;
    a3.display();
    a3=++a2;
    a3.display();


    system("PAUSE");
    return 0;
    }

    هذا المثال يبين كيفية التعامل مع مؤثر التزايد ( ++ ) مع الكائنات بحيث تم تعريف الدالة التحميل الزائد داخل الصنف بالشكل التالي :
    كود
    alpha operator++();

    وكما يظهر أن الدالة لا تحتوي على أي وسائط Parameters ، وبالعادة دائما ما تكون مؤثرات التزايد والتناقص ( ++ , -- ) بدون وسائط ، ويظهر أن الدالة أيضاً ترجع كائن ، وتم كتابة تفاصيل الدالة خارج الصنف باستخدام مؤثر دقة الوصول Scope Resolution Operator كما بالشكل التالي :
    كود
    alpha alpha::operator++()
    {
    ++this->a;
    return *this;
    }

    وسيتم شرح طرق كتابة دالة التحميل الزائد بعد توضيح مخرجات هذا البرنامج .
    كود
    alpha a1,a2(12);
    //
    هنا يطبع العدد 1
    a1.display();
    //
    وهنا يطبع العدد 12
    a2.display();
    //
    بعد ذلك تم تطبيق مؤثر التزايد على الكائن a1
    ++a1;
    //
    وهنا سيطبع العدد 2
    a1.display();
    //
    وهنا تم تطبيق مؤثر التزايد على الكائن a2
    ++a2;
    //
    يطبع القيمة 2
    a2.display();
    //
    تم اشتقاق كائن جديد
    alpha a3;
    //
    قمنا بتطبيق مؤثر التزايد على الكائن الأول تم إسناد قيمة الكائن a1
    //
    في الكائن الجديد a3
    a3=++a1;
    //
    بعد ذلك طباعة الكائن الثالث التي تساوي العدد (3)
    a3.display();
    a3=++a2;
    //
    طباعة العدد ( 14)
    a3.display();

    مؤثر الإسناد ( = ) يعرّف إذا كان لدينا حجز ديناميكي للذاكرة .


    الدوال الصديقه Fa9l
    عبد الواسع عمر الرمانه
    عبد الواسع عمر الرمانه
    طالب لا يضاها
    طالب لا يضاها


    ذكر
    عدد الرسائل : 1299
    العمر : 38
    البلد : اليمن
    القسم والمستوى : أستاد حاسوب
    المزاج : عسل+سكرزياده
      : الدوال الصديقه 15781610
    السٌّمعَة : 5
    نقاط : 430
    تاريخ التسجيل : 14/10/2007

    بطاقة الشخصية
    تخصصي: حاسوب
    المحافظة: الحديدة

    الدوال الصديقه Empty رد: الدوال الصديقه

    مُساهمة من طرف عبد الواسع عمر الرمانه الأحد مارس 01, 2009 10:03 pm

    # يمكن لدالة التحميل الزائد أن ترجع كائن بثلاث طرق

    1-
    استخدام مؤثر This :
    كود
    alpha alpha :: operator ++()
    {
    ++ this ->a;
    return *this;
    }

    2-
    باستخدام كائن مؤقت Temporary Object :
    كود
    alpha alpha :: operator ++()
    {
    alpha tmep;
    temp.a=++a; // (Or) ++this->a;
    }

    3-
    باستخدام كائن من غير اسم Name Less Object
    كود
    alpha alpha :: operator ++()
    {
    int aa;
    aa=++a; \\ (Or) ++this ->a;
    return aa;
    }

    هذه الطرق الثلاثة التي بالإمكان استخدامها مع مؤثري التزايد والتناقص ( ++ , -- ) ولكن مع مراعاة تغيير الإشارات بين المؤثرين .



    **
    تحميل المؤثرات الثنائية ( + , - , * , / , ^ , % ) :

    يتم تحميل المؤثرات الثنائية باستخدام دالة عضو ذات وسيطة واحدة أو باستخدام دالة غير عضو في الصنف مثلاً ( دالة صديقة ) بوسيطتين .

    *
    مثال على تحميل مؤثر الجمع لإجراء عملية الجمع على كائنين باستخدام دالة تحميل عضو :
    كود
    #include
    #include
    using
    حيّز الأسماء
    ',CAPTION,'Namespace',WRAP, TEXTFONTCLASS,'myText','purple');" onmouseout=nd(); href=""Namespace std;
    class add
    {
    private:
    int a;
    public:
    add()
    {
    a=1;
    }
    add ( int a1)
    {
    a=a1;
    }
    void display()
    {
    cout<}
    //
    الوسيطة عبارة عن كائن
    add operator+(add p1)
    {
    this -> a=a+p1.a;
    return *this;
    }};
    int main()
    {
    int x;
    cout<<"Enter x";
    cin>>x;
    add add1,add2(x);
    //
    يطبع القيمة الافتراضية الموجودة في دالة البناء وهي ( 1)
    add1.display();
    //
    يطبع القيمة المدخلة
    add2.display();
    add add3;
    //
    وهنا الأهم حيث يجمع العدد ( 1 ) مع القيمة المدخلة من قبل المستخدم
    add3=add1+add2;
    //
    وهنا يطبع القيمة الجديدة
    add3.display();
    system("PAUSE");
    return 0;
    }
    ويمكن أن تكون دالة التحميل الزائد دالة غير عضو كما ذُكر سابقاً ( مثلاً دالة صديقة
    دالّة صديقة
    ',CAPTION,'Friend Function',WRAP, TEXTFONTCLASS,'myText','purple');" onmouseout=nd(); href=""Friend Function )وفي هذه الحالة يتم تعريفها داخل الصنف بالشكل التالي :
    كود
    friend add operator + (add,add)
    وتفاصيلها تكتب خارج الصنف بالشكل التالي :
    كود
    add operator ( add p1, add p2)
    {
    p1.a = p1.a + p2.a;
    return p1;
    }
    وفي البرنامج الرئيسي يمكن أن نغير add3 إلى
    كود
    add3= operator +(add1,add2)



    **
    تحميل المؤثرات المركبة (+= , -= , *= , /= , ^= , %= )

    ذكرنا بأن تحميل أي مؤثر ثنائي مثل مؤثر الجمع لا يؤدي إلى تحميل المؤثرات المرتبطة به كـ ( += ) وبالتالي أي مؤثر مركب حتى نستطيع استخدامه مع الكائنات لابد من تحميله بشكل صريح .

    *
    مثال يوضح طريقة تحميل المؤثر المركب +=
    كود
    #include
    #include
    using
    حيّز الأسماء
    ',CAPTION,'Namespace',WRAP, TEXTFONTCLASS,'myText','purple');" onmouseout=nd(); href=""Namespace std;
    class meters
    {
    float m;
    public:
    meters()
    {m=0;}
    meters(float m1)
    {
    m=m1;
    }
    void show()
    {
    cout<}
    //
    تعريف دالة التحميل الزائد على أنها دالة صديقة بوسيطتين
    friend meters operator+=(meters ,meters );
    };
    meters operator+=(meters m1,meters m2)
    {
    m1.m+=m2.m;
    return m1;
    }
    int main()
    {
    meters m1,m2(12.5);
    meters m3(m2);
    m1.show(); //0
    m2.show();//12.5
    m3.show();//12.5
    //
    كما يظهر هنا التعامل المؤثر المركب =+
    m2=operator+=(m2,m1);
    m2.show();//12.5
    m3=operator+=(m3,m2);
    m3.show();//25
    system("PAUSE");
    return 0;
    }
    يظهر في هذا المثال طريقة تحميل دالة التحميل الزائد للمؤثر += وكيفية التعامل معها وهذا الحال ينطبق مع باقي المؤثرات المركبة ، وتم في هذا المثال تغيير بناء الدالة حيث تم هنا على أنها دالة صديقة Friend Function عكس ما تم عمله في الدرس الماضي .



    **
    تحميل مؤثرات المقارنة ( == , != , > , < , <= , >= )

    القيمة الراجعة من دالة التحميل الزائد لمؤثرات المقارنة هي عبارة عن قيمة منطقية boolean .

    مثال على تحميل مؤثر (>)
    كود
    #include
    #include
    using
    حيّز الأسماء
    ',CAPTION,'Namespace',WRAP, TEXTFONTCLASS,'myText','purple');" onmouseout=nd(); href=""Namespace std;
    class comp
    {
    int a;
    public:
    comp ( int n )
    {
    a=n;
    }
    bool operator>(comp c)
    {
    return (a > c.a);
    }
    };
    int main()
    {
    int x,y;
    cout<<"enter x,y \n";
    cin>>x>>y;
    comp c1(x),c2(y);
    if (c1>c2)
    cout<<"c1 is greator";
    else
    cout<<"c2 is greator";

    system("PAUSE");
    return 0;
    }

    كما يظهر في هذا المثال يتم المقارنة بين الكائنين c1 و c2 ومن ثم طباعة القيمة الأكبر بينهما ...

    وهذا باختصار عن ما يسمى بالتحميل الزائد للمؤثرات Operator
    إعادة تعريف
    ',CAPTION,'Overloading',WRAP, TEXTFONTCLASS,'myText','purple');" onmouseout=nd(); href=""Overloading .


    وردة الخريف
    وردة الخريف
    نائب المدير
    نائب المدير


    انثى
    عدد الرسائل : 1374
    العمر : 37
    البلد : اليمن
    القسم والمستوى : معلم حاسوب
    المزاج : ممتاز
    العضوية : 75
      : الدوال الصديقه 15781610
    السٌّمعَة : 9
    نقاط : 586
    تاريخ التسجيل : 21/01/2008

    بطاقة الشخصية
    تخصصي: حاسوب
    المحافظة: الحديدة

    الدوال الصديقه Empty رد: الدوال الصديقه

    مُساهمة من طرف وردة الخريف الإثنين مارس 02, 2009 5:57 am

    مشكور أخ عبد الواسع على هذا الموضوع القيم جداً
    مأمون المفلحي
    مأمون المفلحي
    مستشار إداري
    مستشار إداري


    ذكر
    عدد الرسائل : 2676
    العمر : 37
    البلد : في كل حلم جميل
    القسم والمستوى : برمجة حاسوب
    المزاج : أحب الهــــدووووووووء والصراحة
      : الدوال الصديقه 15781610
    السٌّمعَة : 13
    نقاط : 1666
    تاريخ التسجيل : 26/04/2008

    الدوال الصديقه Empty رد: الدوال الصديقه

    مُساهمة من طرف مأمون المفلحي الإثنين مارس 02, 2009 9:32 am

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


    ذكر
    عدد الرسائل : 2833
    العمر : 36
    البلد : الجهورية اليمنية
    القسم والمستوى : خريج قسم الرياضيات 2010م
    المزاج : متقلب ( مزاج شاعر )
    أختر علم دولتك : الدوال الصديقه Female10
      : الدوال الصديقه 15781610
    السٌّمعَة : 14
    نقاط : 985
    تاريخ التسجيل : 28/09/2007

    بطاقة الشخصية
    تخصصي: رياضيات
    المحافظة: الحديدة

    الدوال الصديقه Empty رد: الدوال الصديقه

    مُساهمة من طرف طارق البغوي الثلاثاء مارس 03, 2009 5:36 am

    مشكور اخ عبد الواسع

      الوقت/التاريخ الآن هو الجمعة أبريل 19, 2024 12:08 am