c++ - ترتيب تهيئة متغير ثابت فئة




scope language-lawyer (3)

لدي فئة A والتي لها متغيرين ثابتين. أرغب في تهيئة واحد مع متغير ثابت آخر غير ذي صلة ، تمامًا مثل هذا:

#include <iostream>
class A
{
public:
    static int a;
    static int b;
};

int A::a = 200;
int a = 100;
int A::b = a;
int main(int argc, char* argv[])
{
    std::cout << A::b << std::endl;

    return 0;
}

الإخراج هو 200. لذلك ، يمكن لأي شخص أن يقول لي لماذا؟


لذا ، هل يمكن لأحد أن يقول لي لماذا؟

جاء ذلك بوضوح في basic.scope.class/4 ، منجم التركيز:

يمتد النطاق المحتمل للإعلان الذي يمتد إلى نهاية تعريف الفئة أو بعده أيضًا إلى المناطق المحددة بواسطة تعريفات الأعضاء الخاصة به ، حتى إذا تم تعريف الأعضاء معجمياً خارج الفئة ( بما في ذلك تعريفات أعضاء البيانات الثابتة ، وتعريفات الفئة المتداخلة ، وتعريفات وظيفة العضو ، بما في ذلك نص وظيفة العضو وأي جزء من جزء المُعلِن من هذه التعريفات التي تتبع مُعرِّف المُعرِّف ، بما في ذلك شرط إعلان المعلمة وأي وسيطات افتراضية).

وبالتالي ، عندما يكون لديك

int A::a = 200;
int a = 100;
int A::b = a; // note the '::' scope resolution operator
              // OUTPUT: 200

يشير فعليًا إلى A::a نظرًا لأن نطاق الفئة يتم توسيعه بواسطة A::b .

على عكس ما إذا كان لديك:

int A::a = 200;
int a = 100;
int b = a; // note b is not A::b
           // i.e. without the '::', scope resolution operator
           // OUTPUT: 100

a يشير إلى (عالمي) ::a لأن b هنا ليس عضوًا في class A ،
أي لا تمديد نطاق الطبقة.


لأن البحث عن اسم يحل a كـ A::a . إذا كنت تريد القيام بذلك ، فستحتاج إلى حل النطاق يدويًا:

int A::b = ::a;
        // ^ Global scope resolution

مثال حي


c++draft/class.static

إذا تم استخدام معرّف غير مؤهل في تعريف عضو ثابت يتبع معرف المُعرِّف الخاص بالعضو ، ويجد البحث عن الاسم ([basic.lookup.unqual]) أن المُعرّف غير المؤهل يشير إلى عضو ثابت أو عدّاد أو نوع متداخل من فئة العضو (أو فئة أساسية من فئة العضو) ، يتم تحويل المعرف غير المؤهل إلى تعبير معرف مؤهل حيث يحدد محدد الاسم المتداخل نطاق الفئة الذي تتم الإشارة إلى العضو منه. [ملاحظة: انظر [expr.prim.id] للاطلاع على القيود المفروضة على استخدام أعضاء البيانات غير الثابتة ووظائف الأعضاء غير الساكنة. - مذكرة نهاية]

تقول أن المعرف غير المؤهل يتم تحويله إلى تعبير معرف مؤهل في موقفك.

int A::b = a;

يمكنك تعيين معرف مؤهل ولكن ليس له محدد اسم متداخل مثل هذا.

int A::b = ::a;






language-lawyer