سؤال

وتعليق لأحد مواضيعك بلدي المهتمة لي:

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

أنا أيضا . أنا أيضا إعطاء يمكنهم الدخول / mutators نفس الاسم.

وكنت أتساءل عن هذا، لأنني دائما تستخدم setBar(int bar) بدلا من mutator اسمه الشيء نفسه. أريد أن أعرف: يمكن للمترجم تحديدها استنادا إلى معرف CONST ما تحور في وقت التشغيل، أو يمكن أن تستخدم نفس الاسم وظيفة لأنه يحتوي على المعلمة

هل هذا تجميع ما يرام:

class Foo
{
   int bar_;

   public:
      int bar() { return bar_; }
      void bar(int bar) { bar_ = bar; }
}

وأو لا بد لي من القيام بذلك (وأنا أدرك أنني يجب أن تفعل هذا على أي حال، فقط تشغيل معي على هذا):

int bar() const { return bar_; }

وأنا لا أعرف ما هو الذي. صحة CONST مهمة، لذلك أعتقد أنني أريد المترجم ليعترض على الحمولة الزائدة منذ واحد تحور واحد لا.

لماذا لا يعمل بهذه الطريقة؟

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

المحلول

وأول شيء المترجم ينظر هو عدد ونوع المعلمات كنت تمر على وظيفة. هذا حل الزائد على bar قبل أن تحتاج حتى للنظر في const نيس.

إذا كنت لا للاحتفال bar() كما const، فإن المترجم تعلمك هذه هي المرة الأولى التي تقوم فيها محاولة لاستدعاء bar() على سبيل المثال const للكائن.

نصائح أخرى

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

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

لفهم أسهل، والنظر في يفترض أن المترجم الذي سيتم تغيير كائن إذا كان سيتم استدعاء أسلوب غير CONST لذلك الكائن.

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

ويمكنك أن تنظر مشغلي وسائل كذلك (وأنا أعلم، يمكنك تحديد بعض المشغلين وظائف صديق، وليس وسائل، ولكن لsimplifcation ...). على سبيل المثال، عامل التعيين (المشغل =) هو من غير CONST الافتراضي. وهذا يعني إذا كنت تفعل شيئا مثل

void MyClass::MyConstMethod() const
{
   classMember = value;
}

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

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