ما هي الفائدة من إشارات عابرة CONST لأنواع بدائية؟

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

سؤال

في مشروع I المحافظة، وأرى الكثير من التعليمات البرمجية مثل هذا لأساليب بسيطة get / set

const int & MyClass::getFoo() { return m_foo; }

void MyClass::setFoo(const int & foo) { m_foo = foo; }

ما هي نقطة في القيام بذلك بدلا من التالي؟

int MyClass::getFoo() { return m_foo; }  // Removed 'const' and '&' 

void MyClass::setFoo(const int foo) { m_foo = foo; }  // Removed '&'

وتمرير إشارة إلى نوع بدائي يجب أن تتطلب نفس (أو أكثر) بأكملها تمرير قيمة نوع لنفسه، أليس كذلك؟
انها مجرد رقم على كل حال ...
هل هذا فقط بعض محاولات التحسين الجزئي أو هناك فائدة حقيقية؟

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

المحلول

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

const &int x = myObject.getFoo();
cout<<x<<endl;
//...
cout<<x<<endl;//x might have changed

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

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

void test1(int x)
{
  cout<<x<<endl;//prints 1
}

void test2(const int &x)
{
  cout<<x<<endl;//prints 1 or something else possibly, another thread could have changed x
}

int main(int argc, char**argv)
{
  int x = 1;
  test1(x);
  //...
  test2(x);
  return 0;
}

وهكذا والنتيجة النهائية هي أن تحصل تغييرات حتى بعد يتم تمرير المعلمات.

نصائح أخرى

للي، تمرير <م> مرجع CONST لالبدائيون هو خطأ. إما تحتاج إلى تعديل قيمة، وفي هذه الحالة يمكنك تمرير <م> مرجع غير CONST ، أو كل ما تحتاجه للوصول إلى القيمة وفي هذه الحالة يمكنك تمرير <م> CONST .

المراجع CONST يجب أن تستخدم فقط لفئات معقدة، عندما الأجسام نسخ يمكن أن يكون مشكلة الأداء. في حالة البدائيون، إلا إذا كنت تحتاج إلى تعديل قيمة المتغير الذي لا ينبغي تمرير <م> مرجع . والسبب هو أن <م> المراجع يستغرق مزيدا من الوقت حساب من <م> غير مراجع ، منذ ذلك الحين مع المراجع ، يحتاج البرنامج للبحث عن في جدول للعثور على و<م> عنوان للكائن. عندما يكون هذا الوقت نظرة المتابعة هو أقصر من الوقت النسخ، والمراجع تحسنا.

وعموما، <م> [إينتس] و <م> عناوين لها نفس طول بايت في التنفيذ على مستوى منخفض. وبالتالي فإن الوقت من نسخ و<م> الباحث كقيمة مقابل وظيفة ما يعادل الوقت من نسخ و<م> عنوان . ولكن في الحالة التي يكون فيها أحد الباحث يتم إرجاعها، فلن يتم إجراء بحث، ومن ثم يتم زيادة الأداء.

والفرق الرئيسي بين إرجاع قيمة والعودة إشارة CONST هو أنك ثم يمكن const_cast أن الإشارة وتغيير القيمة.

وانها مثال على التصميم السيئ، ومحاولة لخلق التصميم الذكي حيث التصميم سهلة وموجزة ستكون أكثر من كافية. بدلا من مجرد إرجاع قيمة المؤلف يجعل القراء من التعليمات البرمجية يعتقدون ما نية أنه ربما كان.

وليس هناك الكثير من المنافع. لقد رأيت هذا في إطار أو الماكرو إنشاء حاصل على واضعي قبل. لم التعليمات البرمجية للماكرو لا يميز بين أنواع بدائية وغير POD وتستخدم فقط const type& عبر المجلس عن واضعي. أشك في أن ذلك هو قضية الكفاءة أو سوء فهم حقيقي. وهناك احتمالات هذه مسألة الاتساق.

وأعتقد أن كتابة هذا النوع من التعليمات البرمجية التي يساء فهمها مفهوم المراجع واستخدامه في كل شيء بما في ذلك أنواع البيانات البدائية. رأيت أيضا بعض التعليمات البرمجية مثل هذا ولا أرى أي فائدة من القيام بذلك.

وليس هناك نقطة والاستفادة باستثناء

void MyClass::setFoo(const int foo)
void MyClass::setFoo(const int& foo)

وكما فإنك لن تكون قادرا على إعادة "فو" تنفيذ "setFoo 'متغير في الداخل. وأعتقد أن "كثافة العمليات و" هو لمجرد غي مجرد الحصول على استخدامها لتمرير كل شيء بالرجوع CONST وليس هناك حرج في ذلك.

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