سؤال

لنفترض أن لدي هذا البرنامج:

class Foo {
 public:
    unsigned int bar () {
        static unsigned int counter = 0;
        return counter++;
    }
};

int main ()
{
    Foo a;
    Foo b;
}

(بالطبع هذا المثال لا معنى له لأنني من الواضح أنني أعلن "عداد" كسممة خاصة ، ولكن فقط توضيح المشكلة).

أود أن أعرف كيف يتصرف C ++ في هذا النوع من الموقف: هل سيكون "العداد" المتغير في طريقة الشريط () هو نفسه لكل حالة؟

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

المحلول

نعم، counter سيتم مشاركتها في جميع حالات الكائنات من النوع Foo في قابلة للتنفيذ. طالما كنت في بيئة فردية ، فسوف تعمل كما هو متوقع كجهاز عداد مشترك.

في بيئة متعددة مؤشرات الترابط ، سيكون لديك ظروف سباق مثيرة للاهتمام لتصحيح :).

نصائح أخرى

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

ولكن ضع في اعتبارك أنه مع متغيرات الفصل ، عليك أن تأخذ أشياء مثل متعدد الخيوط في الاعتبار في كثير من الحالات ، وهو موضوع مختلف تمامًا.

من لغة البرمجة C ++ (الطبعة الثانية), ، صفحة 200 ، بقلم Bjarne Stroustrup:

لا تستخدم ثابتة باستثناء وظائف [البسيطة] (§7.1.2) والفئات (§10.2.4).

كان مثالك على بعد خطين من كونك شيئًا يمكنك تجميعه واختباره:

#include <iostream>
using namespace std;
class Foo {
 public:
    unsigned int bar () {
        static unsigned int counter = 0;
        return counter++;
    }
};

int main ()
{
    Foo a;
    Foo b;

    for (int i=0; i < 10; i++)
      cout<<i<<". "<<a.bar()<<" / "<<b.bar()<<endl;
}

يبدو الناتج مثل هذا:

0. 1 / 0
1. 3 / 2
2. 5 / 4
3. 7 / 6
4. 9 / 8
5. 11 / 10
6. 13 / 12
7. 15 / 14
8. 17 / 16
9. 19 / 18

لذا نعم ، يتم مشاركة العداد في جميع الحالات.

تحتاج فقط إلى فهم شيئين:

  1. يتم تخزين المتغيرات الثابتة في منطقة ثابتة لبرنامج التنفيذ (وهو نفس المتغير العالمي).
  2. يقتصر النطاق على القواعد العامة للأقواس. المتغيرات الثابتة ذات الصلة لها صلة داخلية.
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top