سؤال

لقد سمعت أن هناك اختلافات بين اللغات حول معنى الكلمة الرئيسية static, ، لكنني لم أجد قائمة جيدة تعزز تلك الاختلافات.

إليك ما أعرفه عن معنى static في C ++:

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

كيف معنى static تغيير في لغات أخرى؟

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

المحلول

ج


  • يمكن للكلمة الرئيسية تغيير الارتباط أو المدة (مدى الحياة) للكائن.
  • تتم تهيئة المتغيرات دائمًا إلى 0
  • الوظائف لها علاقة داخلية.
  • إذا تم الإعلان عنها في نطاق مستوى الملف: يكون للمتغيرات ارتباط داخلي ومدة ثابتة (أي موجود طوال عمر البرنامج)
  • إذا تم الإعلان عنها في نطاق الكتلة: لا يوجد أي روابط ولكن مدة ثابتة
  • يمكن أن يكون هناك إعلانات متعددة من نفس المتغير الثابت في وحدة الترجمة. ومع ذلك ، لاحظ أنها يجب أن تكون هي نفسها. على سبيل المثال: في نطاق مستوى الملف:

int a;        // a has external linkage

static int a; // a now has static linkage
              // same as if you wrote: static int a = 0;

//...

static int b; // static linkage

extern int b; // extern loses its meaning, b still has internal linkage

//...

extern int b; // b has external linkage

static int b; // error

//...

void func() {
  static int x; // automatic linkage, static duration
                // same as if you wrote: static int x = 0;
}

C ++


  • في نطاق مستوى الملف ، تم إهمال الاستخدام لكل من المتغيرات والأعضاء لصالح مساحات الأسماء المجهولة. موجود فقط كتوافق
  • لا تزال المتغيرات يتم تهيئتها الافتراضية (كما في C) إلى 0
  • "6.7 يتم تنفيذ الصفر (8.5) لجميع الكائنات المحلية مع مدة تخزين ثابت (3.7.1) أو مدة تخزين مؤشرات الترابط (3.7.2) قبل إجراء أي تهيئة أخرى [...]
  • المتغيرات لها مدة تخزين ثابتة ما لم ترافقها thread_local محدد (من C ++ 0x فصاعدا)
  • يمكن أن يكون هناك تعريف واحد فقط للستاتي في وحدة الترجمة
  • متغيرات/وظائف الأعضاء تعني أنها خصائص للصف وليس بناء الجملة القانوني للوصول القانوني: مثيل.
  • لا يمكن للوظائف الأعضاء الثابتة الوصول فقط إلى متغيرات الأعضاء الثابتة لا this مؤشر لمثل هذه الوظائف
  • ومع ذلك ، يمكن للأعضاء غير الأساسيين الوصول إلى أي عضو ثابت
  • في مستوى الملف ، يكون للكائنات ارتباط داخلي باستثناء أعضاء الفصل الذين لديهم نطاق الفصل
  • يجب تعريف أعضاء الفصل إما في إعلان الفصل أو خارج صريح عبر اسم الفصل ومشغل دقة النطاق
  • لا يمكن استخدام this في طريقة ثابتة

ActionScript


  • طرق الفصل كما في C ++
  • لا يمكن استخدام this أو super في طريقة ثابتة
  • يتم الوصول إليه فقط من خلال اسم الفصل وليس اسم المثيل
  • غير موروث
  • ومع ذلك ، فإن الفصول المشتقة لديها حق الوصول إلى الخصائص الثابتة للقواعد
  • يجب تهيئة المتغيرات التي يتم إعلانها مع كل من الكلمات الرئيسية الثابتة و const في نفس الوقت الذي تعلن فيه الثابت

التصميم الموجهة نحو الكائن


  • يعتبر الكثير من نمط تصميم Singleton ككائن ثابت مجيد
  • تستخدم في نمط تصميم المصنع

ربما فاتني الكثير من الأشياء الأخرى - لا تتردد في ذلك.

نصائح أخرى

In Delphi the static keyword is used exclusively for defining class methods. In Delphi a normal class method can be declared virtual and overridden in a subclass. Additionally Delphi has a self variable, similar to the this pointer in other languages. However in a class method the self points to the class in which the method is called instead of an instance.

Declaring a class method static means:

  1. It cannot be overridden in a subclass
  2. It does not have a self pointer

This means a static class method can only access class members in the class it was defined in, while a normal class method can access overridden class members in derived classes.

There are other informal uses of static in the Delphi documentation usually referring to a feature unchangability (is that a word?). For instance a static array vs a dynamic array. All instance methods in Delphi are static unless declared otherwise.

In VB.NET, a Static variable is just like a C++ local static variable.

However, there is no class-wide Static; use Shared instead.

في C# هناك 3 طرق يمكن استخدام كلمة رئيسية ثابتة:

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

أتمنى أن يساعدك هذا.

في C# يعني دائمًا: "تتعلق بنوع بدلاً من مثيل من النوع".

يحتوي Python على Decorator staticMethod ، والذي عند تطبيقه على عضو في الفصل ، يجعل الطريقة متاحة في الفصل بدلاً من الحالات ، ولا تمرر أي وسيطات تلقائية إلى هذه الطريقة. يقوم ClassMethod Decorator بإجراء وظيفة مماثلة ، لكنه يمرر الفصل كوسيطة أول ، مما يجعله أكثر فائدة.

في C ، الأعلام الثابتة دالة أو متغير عالمي كمحلية للملف الموجود فيه.

انها نوعا ما مثل الخاص بلغات أخرى. نوعا ما.

إذا كانت في وظيفة ، فعندئذٍ ، فإن Preallocates ثابتة تتغير في قسم البيانات في الثنائي ، وليس على المكدس في وقت التشغيل.

في VB.NET ، يتم استخدام مستوى الإجراء الثابت ليعني أن المتغير يرتبط بجميع عمليات الإعدام في الإجراء (يتم الحفاظ عليه من المكالمة إلى المكالمة). هذا قليلاً من استخدام غامض في تطبيق موجه نحو الكائن.

النظير "مشترك" مما يعني أن الطريقة أو العضو هي مستوى الكتابة (لا تحتاج إلى مثيل للوصول إليه).

يلخص ويكيبيديا العديد من المعاني المختلفة static:

طرق ثابتة, المتغيرات الثابتة, كتابة ثابتة.

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