[c++] C ++، فئات، كونست، وبناء جملة غريب


Answers

على الرغم من getccp() هو طريقة const أنه لا يجعل أي وعود ما تفعله مع مرجع يعود. الطريقة نفسها لا تعديل الكائن وبالتالي لا يكسر القواعد.

إذا عاد const ConstCheater& وثم ذلك سيكون مختلفا.

كما يظهر المثال الخاص بك، هناك أكثر تعقيدا بكثير من const من مجرد تطبيقه على كائن. تحتوي الأسئلة الشائعة C ++ على قسم عن صحة كونست وعلى وجه الخصوص تغطي الحالة التي تسلط الضوء عليها هنا.

Question

كنت أعيد قراءة C ++ التمهيدي (4th إد.) اليوم - القسم على وظائف الأعضاء والمراجع كونست الخ، وخرجت مع هذا البرنامج الصغير ويرد:

using std::cout;
using std::endl;

class ConstCheater
{
public:
    ConstCheater(int avalue) : ccp(this), value(avalue) {}
    ConstCheater& getccp() const {return *ccp;}
    int value;
private:
    ConstCheater* ccp;
};

int main()
{
    const ConstCheater cc(7); //Initialize the value to 7
    cout << cc.value << endl;
    cc.getccp().value = 4;    //Now setting it to 4, even though it's const!
    cout << cc.value << endl;
    cc.value = 4;             //This is illegal
    return 0;
}

سؤالي هو - لماذا c + + السماح بناء الجملة مثل هذا؟ لماذا يمكنني تعديل أعضاء البيانات العادية في فئة عندما يتم الإعلان عن كونست؟ أليس نقطة كونست لجعله بحيث لا يمكنك تعديل القيم؟




الكائن الخاص بك هو غير قابل للتغيير تماما: انها مجرد إشارة قمت بإنشائها للإشارة إلى أنه ثابت.




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




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

      Member& getccp()       {return *member;}
const Member& getccp() const {return *member;} 

في بعض الحالات عندما الثبات المنطقي من الكائن الخاص بك لا تعاني من التعديل الخارجي من انها عضو يمكنك السماح

      Member& getccp() const {return *member;}

مثال آخر على الاختلاف في الثبات المنطقي والرسمي هو الأعضاء القابلة mutable . إي يمكن أن تكون قابلة للتغيير بعض المصطلح الذي تم حسابه في استدعاء طريقة const الأخير، إذا كنت سوف تحصل على نفس المدخلات في استدعاء المقبل يمكنك بسهولة عودة القيمة المخزنة.




Links