سؤال

أنا في حيرة قليلا لماذا قيل لي عودة const فو من ثنائي المشغل في c++ بدلا من مجرد فو.

لقد تم قراءة بروس Eckel هو "التفكير في C++" و في الفصل على عامل الحمولة الزائدة ، يقول "بجعل قيمة الإرجاع [من الإفراط في التحميل الثنائية مشغل] const ، الدولة فقط const الأعضاء وظيفة يمكن أن يسمى ذلك قيمة الإرجاع.هذا هو const-الصحيح, لأنه يمنع من تخزين المعلومات ذات القيمة في كائن من شأنها أن تكون الأكثر احتمالا أن تضيع".

ومع ذلك ، إذا كان لدي بالإضافة إلى المشغل بإرجاع const ، بادئة زيادة المشغل ، هذا الرمز غير صالح:

class Integer{
int i;

public:
    Integer(int ii): i(ii){ }
    Integer(Integer&);

    const Integer operator+();
    Integer operator++();
};


int main(){

Integer a(0);
Integer b(1);

Integer c( ++(a + b));
}

يسمح هذا النوع من الإحالة ، لا يعقل أن يكون المشغل + عودة غير const قيمة ؟ ويمكن القيام بذلك عن طريق إضافة const_casts ، ولكن الذي يحصل ضخمة جدا ، أليس كذلك ؟

وذلك بفضل!

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

المحلول

وعندما تقول ++ س، تقوله "إضافة 1 إلى x، تخزين النتيجة مرة أخرى في العاشر، وتقول لي ما كان عليه". هذه هي المشغل preincrement. ولكن، في ++ (أ + ب)، كيف حالك من المفترض أن "تخزين النتيجة مرة أخرى إلى + ب"؟

وبالتأكيد يمكن تخزين النتيجة مرة أخرى إلى المؤقتة التي تحتجز في الوقت الحاضر نتيجة ل+ ب، التي من شأنها أن تختفي قريبا بما فيه الكفاية. ولكن إذا كنت لا تهتم حقا حيث تم تخزين نتيجة لذلك، لماذا زيادة فإنه بدلا من مجرد إضافة واحدة؟

نصائح أخرى

ولمعلوماتك، ++(a + b) غير قانوني حتى مع السنفات (أنواع البيانات القديمة عادي، مثل int). لذلك فمن المنطقي ألا تسمح لأنواع الطبقة الخاصة بك أيضا. جرب هذا:

int a = 1;
int b = 2;
int c = ++(a+b);

وعوائد دول مجلس التعاون الخليجي error: lvalue required as increment operand.

في قضيتك، فإنه سيكون من الأفضل عمل نسخة منشئ الخاص نلقي الحجة const Integer، وخلق Integer c الخاصة بك مثل هذا بدلا من ذلك:

Integer c(a + b + Integer(1));

نسخ منشئات عادة ما تأخذ const المرجع في حل هذه المشكلة لك.

(وجود غير const نسخ المنشئ يعني نقل بعض الموارد التي يمكن أن تكون مفيدة في بعض الأحيان ، ولكن 99 ٪ من جميع الحالات ، إنه لا حاجة)

وأعتقد أن المثال OP لتكون مناسبة للسؤال إذا تم استبدال عامل الجمع مع أي مشغل ثنائي الأخرى التي بإرجاع مرجع، على سبيل المثال لعامل التعيين:

Integer c( ++(a = b));

وجئت الى هنا أتساءل عما إذا كان ينبغي لي أن أجعل عامل التعيين بإرجاع CONST أو مرجع غير CONST. بعض الدروس استخدام الإصدارات غير CONST، على عكس "التفكير في C ++" الصورة المشورة. و بعض المراجع الأخرى إعطاء الأسباب الكامنة وراء ذلك:

<اقتباس فقرة>   

لاحظ أن الإشارة عاد ولم تعلن CONST. هذا يمكن أن يكون مربكا بعض الشيء، لأنه يسمح لك لكتابة الأشياء المجنونة مثل هذا:

     <اقتباس فقرة>     

وMyClass أ، ب، ج؛

         

...

         

و(أ = ب) = ج. // ماذا ؟؟

        

للوهلة الأولى، قد ترغب في منع مثل هذه الحالات، من خلال وجود عامل = إرجاع إشارة CONST. ومع ذلك، فإن مثل هذه التصريحات يعمل مع أنواع بدائية. وأسوأ من ذلك، بعض الأدوات تعتمد في الواقع على هذا السلوك. لذلك، من المهم أن يعود إشارة غير CONST من مشغل =. وبحكم التجربة هو: "إذا كانت جيدة بما يكفي ل[إينتس]، انها جيدة بما فيه الكفاية ل-أنواع البيانات المعرفة من قبل المستخدم."

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