سؤال

أحاول إنشاء دالة عامل تشغيل متجاوزة باستخدام معلمتي const، لكن لا يمكنني معرفة كيفية القيام بذلك.اليك مثال بسيط:

class Number
{
    Number()
    {
        value = 1;
    };

    inline Number operator + (const Number& n)
    {
        Number result;

        result.value = value + n.value;
        return result;
    }

    int value;
}

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

const Number a = Number();
const Number b = Number();
Number c = a + b;

هل هذا ممكن وكيف سأقوم بذلك؟

شكرًا،

دان

هل كانت مفيدة؟

المحلول

ومن المفهوم inline في الإعلانات الفئة بحيث لا تحتاج إلى تحديد ذلك.

ومعظم اصطلاحا، هل جعل operator+ وظيفة غير عضو أعلن خارج تعريف الفئة، مثل هذا:

Number operator+( const Number& left, const Number& right );

وقد تحتاج إلى جعلها friend الطبقة إذا كان يحتاج إلى الوصول إلى الداخلية Number ل.

إذا كان لديك لأنها دالة عضو فأنت بحاجة لجعل وظيفة نفسها CONST:

Number operator+( const Number& n ) const
{ // ...

لفئات مثل Number، يتم تطبيق operator+ عادة من حيث operator+= كالعادة كنت تريد جميع مشغلي المعتادة للعمل كما هو متوقع وoperator+= أسهل عادة لتنفيذ وoperator+ يميل ألا تفقد أي الكفاءة على تنفيذ بشكل منفصل.

وداخل الطبقة:

Number& operator+=( const Number& n );

وخارج الصف:

Number operator+( const Number& left, const Number& right )
{
    return Number( left ) += right;
}

وأو حتى:

Number operator+( Number left, const Number& right )
{
    return left += right;
}

نصائح أخرى

class Number
{
    Number()
    {
        value = 1;
    };

    inline Number operator + (const Number& n) const
    {
        Number result;

        result = value + n.value;
        return result;
    }

    int value;
}

وماذا عن:

inline Number operator + (const Number& n) const

بينما أشعر أن الإجابات السابقة جيدة بما فيه الكفاية، أعتقد أن هناك حاجة إلى بعض التوضيح.

يأتي المشغلون (عادة) بنكهتين

الأول هو الوظائف غير الأعضاء، والثاني هو وظيفة العضو التي تكون معاملتها هي "المعامل الصحيح" للعملية والتي عادةً ما تُرجع الكائن المعدل الحالي.

على سبيل المثال، تخيل أن هناك عامل § لفئة T.يمكن كتابتها إما كـ وظيفة غير الأعضاء:

T operator § (const T & lhs, const T & rhs)
{
   T result ;
   // do the lhs § rhs operation, and puts the result into "result"
   return result ;
}

أو ك وظيفة العضو:

T & T::operator § (const T & rhs)
{
   // do the "this § rhs" operation, and puts the result into "this"
   return *this ;
}

أو حتى (على غير العادة) كآخر وظيفة العضو:

T T::operator § (const T & rhs) const
{
   T result ;
   // do the "this § rhs" operation, and puts the result into "result"
   return result ;
}

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

تنصل:هناك نكهات أخرى، لكنني سأقتصر على العمليات الحسابية مثل +, *, /, -, ، إلخ.هنا، بالإضافة إلى نماذج المشغلين "الموثوقة".

تحليل استخدامك للمشغل

في حالة +:

  1. يجب أن يكون كل مُعامل ثابتًا لأن a = b + c يجب ألا تتغير b, ، ولا c.
  2. يمكنك أن تتراكم +, ، كما هو الحال في a = b + c + d + e, ، لذلك يجب أن تكون المؤقتة موجودة.
T operator § (const T & lhs, const T & rhs)
{
   T result ;
   // do the lhs § rhs operation, and puts the result into "result"
   return result ;
}

في حالة +=:

  1. أنت تعلم أنه سيتم تعديل المعامل الأيسر A (من A += B).
  2. أنت تعلم أن المعامل الأيسر A (من A += B) هو نتيجته الخاصة.

لذلك يجب عليك استخدام:

T & T::operator += (const T & rhs)
{
   // do the "this § rhs" operation, and puts the result into "this"
   return *this ;
}

كما هو الحال دائمًا، فإن التحسين المبكر هو أصل كل الشرور

لقد رأيت هذا النوع من التعليمات البرمجية في كود الإنتاج، لذا فهو يفعل يحدث:

T & operator + (const T & lhs, const T & rhs)
{
   static T result ; // result is STATIC !!!!
   // do the lhs + rhs operation, and puts the result into "result"
   return result ;
}

كان المؤلف يأمل في الاقتصاد في واحدة مؤقتة.مع هذا النوع من التعليمات البرمجية، والكتابة a = b + c + d يؤدي إلى نتائج مثيرة للاهتمام (وخاطئة).

^_^

أخيراً وليس آخراً

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top