لماذا يفضل تشغيل المشغل الزائد صديقا للمشغل في هذه الحالة

StackOverflow https://stackoverflow.com/questions/2439402

سؤال

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

شكرا جزيلا!

class A{

    double i;
public:
    A(int i):i(i) {}
    operator double () const { cout<<"conversion operator"<<endl;return i;}                            // a conversion operator
    friend bool operator>(int i, A  a);                            // a friend funcion of operator >
};

bool operator>(int i, A  a ){
    cout<<"Friend"<<endl;
    return i>a.i;
}
int main()
{
    A  aa(1);
     if (0 > aa){
         return 1;
      }
}
هل كانت مفيدة؟

المحلول

لا يوجد تحويل ضروري للحمل الزائد operator> أن يسمى. من أجل المدمج operator> ليتم استدعاؤه، هناك تحويل واحد ضروري (مشغل التحويل المعرفة من قبل المستخدم. قرار الزائد يفضل الخيارات مع تحويل عدد أقل من التحويلات المطلوبة، وبالتالي فإن التحميل الزائد operator> يستخدم.

لاحظ أنه إذا كنت تقوم بتغيير تعريف التحميل الزائد operator> أن تكون، على سبيل المثال:

friend bool operator>(double i, A  a);

سوف تحصل على خطأ في تجميع لأن كلا الزائد operator> والمدمج في operator> سيتطلب تحويل واحد، ولن يتمكن المترجم من حل الغموض.

نصائح أخرى

أنا لا أدعي أن إجابتي مدعومة بالمعايير، ولكن دعونا نفكر في الأمر منطقيا.

عند ضرب هذا الخط:

0 > aa

لديك خياران. إما أن تسمون المشغل المتوفر:

friend bool operator>(int i, A  a);

ما هو 100٪ متوافق، أو يمكنك القيام تحويلتين للوصول إلى وجهتك! أي واحد سوف تختار؟

إذا قمت بإضافة مشغل تحويل، فقد يتم تحويل كائن من النوع A إلى مضاعفة عندما تتوقع ذلك.

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

نظرا لأن مشغلي التحويلات النتيجة (ومزعمو حجة واحدة) يجب أن يتم التعامل مع بعض الرعاية بسبب المواقف التي قد يكون فيها المترجم قد يحول عندما لا تتوقع ذلك.

يطلق عليه لأنه تطابق تام في سياق التعبير 0 > aa. وبعد في الواقع، من الصعب معرفة كيفية توصلت إلى سؤال "لماذا". من خلال المنطق، يتوقع One'd "لماذا" سؤال إذا كان الصديق لم تفعل ذلك دعا في هذه الحالة.

إذا قمت بتغيير التعبير إلى 0.0 > aa, ، سوف تكون المكالمة غامضة، لأن مسار الحواد سيكون أفضل من الآخر.

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