کلمه کلیدی ثابت

گاهی اوقات می خواهید عضوی از یک کلاس را تعریف کنید که مستقل از سایر اشیاء آن کلاس استفاده شود. به عنوان یک قاعده، دسترسی به یک عضو کلاس از طریق یک شی از این کلاس سازماندهی می شود، اما در عین حال، امکان ایجاد یک عضو کلاس برای استفاده مستقل بدون ارجاع به یک نمونه خاص از شی وجود دارد. برای ایجاد چنین عضو کلاسی، کافی است در همان ابتدای اعلامیه آن مشخص شود کلمه کلیدیایستا.

اگر یک عضو کلاس ایستا اعلام شود، آنگاه قبل از ایجاد هر شیء کلاس آن و بدون ارجاع به هیچ شیئی در دسترس می شود. کلمه کلیدی استاتیک را می توان برای تعریف متغیرها و روش ها استفاده کرد. متداول ترین مثال یک عضو استاتیک متد Main() است که به این صورت اعلام می شود زیرا باید فراخوانی شود. سیستم عاملدر همان ابتدای برنامه در حال اجرا.

برای استفاده از عضوی از نوع static در خارج از کلاس کافی است نام این کلاس را با عملگر نقطه مشخص کنید. اما شما نیازی به ایجاد یک شی برای این کار ندارید. در واقع، یک عضو استاتیک با ارجاع به یک شی قابل دسترسی نیست، بلکه با نام کلاس آن قابل دسترسی است.

متغیرهای اعلام شده به عنوان ثابت اساساً سراسری هستند. هنگامی که اشیاء در کلاس خود اعلام می شوند، سپس یک کپی متغیر نوعاستاتیک ایجاد نمی شود. درعوض، همه نمونه‌های کلاس متغیر مشابهی از نوع static دارند. چنین متغیری قبل از استفاده در کلاس مقداردهی اولیه می شود.

مثالی از استفاده از کلمه کلیدی ثابت:

استفاده از سیستم؛ با استفاده از System.Collections.Generic. با استفاده از System.Linq؛ با استفاده از System.Text. فضای نام ConsoleApplication1 ( کلاس myCircle ( // 2 متدهایی که مساحت و طول یک دایره را برمی گرداند SqrCircle دوبل استاتیک عمومی (شعاع int) (بازگشت Math.PI * شعاع * شعاع؛ ) دوبل استاتیک عمومی LongCircle(int شعاع) (بازگشت 2 * Math.PI * radio; دایره با شعاع (0) = (1 :#.##)",r,myCircle.SqrCircle(r)); Console.WriteLine("طول دایره (0:#.##)"،myCircle. LongCircle(r)); Console.ReadLine(); ) ))

تعدادی محدودیت برای استفاده از روش های نوع استاتیک وجود دارد:

    روشی از نوع static نباید دارای این مرجع باشد، زیرا چنین روشی روی هیچ شیئی اجرا نمی شود

    در روشی از نوع static، فقط روش‌های دیگر از نوع static مجاز به فراخوانی مستقیم هستند، نه یک متد نمونه از همان کلاس. نکته این است که متدهای نمونه بر روی اشیاء خاص عمل می کنند و متد نوع استاتیک روی یک شیء فراخوانی نمی شود. بنابراین، چنین روشی هیچ شیئی ندارد که بتواند روی آن عمل کند.

    محدودیت های مشابهی برای داده های از نوع static اعمال می شود. برای روشی از نوع static، فقط سایر داده‌های نوع static که در کلاس آن تعریف شده‌اند مستقیماً قابل دسترسی هستند. به ویژه، او نمی تواند روی یک متغیر نمونه از کلاس خود عمل کند، زیرا او اشیایی ندارد که بتواند با آن کار کند.

سازنده های ایستا

یک سازنده همچنین می تواند به عنوان ثابت اعلام شود. یک سازنده استاتیک معمولاً برای مقداردهی اولیه مولفه هایی استفاده می شود که برای کل کلاس اعمال می شود، نه برای یک نمونه واحد از یک شی از آن کلاس. بنابراین، اعضای کلاس قبل از ایجاد هر شیء از آن کلاس، با یک سازنده استاتیک مقداردهی اولیه می شوند:

استفاده از سیستم؛ با استفاده از System.Collections.Generic. با استفاده از System.Linq؛ با استفاده از System.Text. namespace ConsoleApplication1 ( کلاس MyClass ( عمومی static int a; عمومی int b; // سازنده استاتیک static MyClass() (a = 10; ) // سازنده معمولی عمومی MyClass() (b = 12;) ) کلاس Program ( static void Main (رشته args) ( Console.WriteLine ("دسترسی به نمونه ای از کلاس a: " + MyClass.a)؛ MyClass obj = جدید MyClass(); Console.WriteLine ("دسترسی به نمونه ای از کلاس b: " + obj.b) ؛ کنسول .ReadLine(); ) )

توجه داشته باشید که سازنده نوع استاتیک به طور خودکار زمانی که کلاس بارگذاری می شود و قبل از سازنده نمونه فراخوانی می شود. از این می‌توان نتیجه کلی‌تری گرفت: یک سازنده استاتیک باید قبل از هر سازنده نمونه اجرا شود. علاوه بر این، سازنده های ایستا اصلاح کننده دسترسی ندارند - آنها دسترسی پیش فرض دارند و بنابراین نمی توانند از برنامه فراخوانی شوند.

کلاس های استاتیک

یک کلاس را می توان به عنوان ثابت اعلام کرد. یک کلاس استاتیک دو ویژگی اصلی دارد. ابتدا اشیاء کلاس ایستا ایجاد کنید ممنوع است. و ثانیاً، یک کلاس استاتیک باید فقط شامل اعضای ثابت باشد. یک کلاس استاتیک با فرم اعلان کلاس زیر ایجاد می شود که با کلمه کلیدی static اصلاح شده است.

نام کلاس کلاس ایستا ( // ...

کلاس های استاتیک عمدتا در دو مورد استفاده می شود. اول، یک کلاس استاتیک هنگام ایجاد مورد نیاز است روش گسترش. روش های پسوند بیشتر با زبان LINQ مرتبط هستند. و ثانیاً یک کلاس static برای ذخیره مجموعه ای از متدهای استاتیک مرتبط با یکدیگر عمل می کند.

در این مقاله به بررسی روش های استاتیک در جاوا و مقایسه Static و Instance می پردازیم. نکته اصلی که باید به خاطر داشته باشید این است که اگر از کلمه کلیدی استاتیک با هر روشی استفاده کنید، به آن متد استاتیک می گویند.

متدهای استاتیک در جاوا چیست؟

روش های استاتیکمتدهایی در جاوا هستند که می توانند بدون ایجاد یک شی از کلاس فراخوانی شوند. آنها با نام (طبقه طبقه بندی) مستند شده اند.
کلمه کلیدی استاتیک را می توان با کلاس، متغیر، متد و بلوک استفاده کرد. اعضای ثابتمتعلق به کلاس است و نه به یک نمونه خاص، به این معنی که اگر یک عضو را ثابت کنید، می توانید بدون شی به آن دسترسی داشته باشید. برای درک این موضوع مثالی می زنیم:

در اینجا یک متد static myMethod داریم، می‌توانیم این متد را بدون هیچ شیئی فراخوانی کنیم زیرا وقتی عضوی را ثابت می‌کنیم، سطح کلاس می‌شود. اگر کلمه کلیدی static را حذف کنیم و آن را غیر ایستا کنیم، باید یک شی کلاس برای فراخوانی آن ایجاد کنیم.

اعضای استاتیک برای همه نمونه‌ها (اشیاء) یک کلاس مشترک هستند، اما اعضای غیراستاتیک برای هر نمونه کلاس جداگانه هستند.

کلاس SimpleStaticExample ( // این یک روش ثابت استاتیک void myMethod() ( System.out.println("myMethod"); ) public static void main(string args) (/* تو می توانیببینید که ما این متد * را بدون ایجاد هیچ شیئی فراخوانی می کنیم. */ myMethod(); ))

نحو

public static void geek (نام رشته) ( // کدی که باید اجرا شود ....

در نسل دائمی ذخیره می شود زیرا با (طبقه بندی دسته) جایی که آنها هستند مرتبط است و نه با اشیاء آن کلاس. با این حال، متغیرهای محلی آنها، و همچنین آرگومان(های) ارسال شده به آنها، در پشته قرار دارند.

نکات مهم:

  • یک متد(های) استاتیک مرتبط با کلاسی که در آن قرار دارند، یعنی به آن مراجعه می کنند حتی اگر کلاس را نمونه سازی نکند، یعنی. ClassName.methodName(args).
  • آنها در نظر گرفته شده اند اشتراک گذاریتمام اشیاء ایجاد شده از یک کلاس
  • روش های استاتیک را نمی توان نادیده گرفت.

مثالی از استفاده از متدهای استاتیک در جاوا:

وارد کردن java.io.*؛ class Flair( Public Static String FlairName = ""؛ Public Void Geek (نام رشته) ( FlairName = نام; ) ) class GFG ( Public Void main (String args) ( Flair.flair ("vaibhav"); System.out .println(Flair.flairName); Flair obj = Flair جدید(); obj.flair("shadow"); System.out.println(obj.flairName); ) )

نتیجه:
ویبهاو
سایه

متغیرهای استاتیک (استاتیک) و مقادیر آنها (اولیه یا مراجع) در داخل کلاس تعریف شده و در فضای حافظه PermGen ذخیره می شوند.

اگر یک متغیر استاتیک به یک شی اشاره کند چه؟

static int i = 1;
static Object obj = New Object();

خط اول مقداری است که در قسمت PermGen ذخیره می شود. در خط دوم مرجع obj در قسمت PermGen و شیئی که به آن اشاره می کند در قسمت heap ذخیره می شود.

چه زمانی استفاده می شوند؟

  • اگر کدی دارید که می تواند توسط همه نمونه های یک کلاس به اشتراک گذاشته شود، آن قطعه کد را در یک متد Static قرار دهید.
  • اول از همه، فیلدهای دسترسی ثابت را برای کلاس تنظیم کنید.

روش نمونه جاوا چیست؟

روش نمونه جاواروش هایی هستند که در آنها می توان یک شی از یک کلاس را قبل از فراخوانی ایجاد کرد. برای فراخوانی یک متد نمونه، باید از دسته ای که در آن تعریف شده است، یک شی بسازیم.

Public void flair (نام رشته) // کدی که باید (اجرا می شود... ) // نوع برگشتی می تواند int، float String یا نوع داده تعریف شده توسط کاربر باشد.

پارامترها (آگومان های ارسال شده به آنها)، و همچنین متغیرهای محلی و مقدار بازگشتی آنها، در پشته تخصیص داده می شوند.

نکات مهم:

  • نمونه‌ها به شی کلاس تعلق دارند، نه کلاس، یعنی همچنان همانطور که پس از ایجاد شی کلاس بودند، ارجاع داده می‌شوند.
  • هر یک شی جدایک ایجاد شده از (کلاس، دسته) کپی خود را از متد(های) نمونه آن کلاس دارد.
  • می توان آنها را نادیده گرفت.

روش نمونه یا روش استاتیک در جاوا؟

  • متد نمونه دسترسی مستقیم به متدها و متغیرهای نمونه خواهد داشت.
  • متد نمونه مستقیماً به متغیرهای استاتیک و متدهای استاتیک دسترسی خواهد داشت.
  • متدهای استاتیک مستقیماً به متغیرها و متدهای استاتیک دسترسی خواهند داشت.
  • متدهای استاتیک نمی توانند مستقیماً به متدهای نمونه و متغیرهای نمونه دسترسی داشته باشند. و یک روش ایستا نمی تواند از این استفاده کند زیرا هیچ نمونه ای برای "this" وجود ندارد که بتوان به آن اشاره کرد.

سپس می توانیم مستقیماً از طریق نام کلاس و عملگر scope resolution به آنها دسترسی داشته باشیم. اما اگر متغیرهای عضو استاتیک خصوصی باشند چه؟ کد زیر را در نظر بگیرید:

در این مورد، نمی‌توانیم مستقیماً به Anything::s_value از main() دسترسی داشته باشیم زیرا آن عضو خصوصی است. معمولاً اعضای خصوصی یک کلاس از طریق متدهای عمومی قابل دسترسی هستند. در حالی که می‌توانیم یک متد معمولی برای دسترسی به s_value ایجاد کنیم، سپس باید یک شی از آن کلاس برای استفاده از متد ایجاد کنیم! گزینه بهتری وجود دارد: می توانیم روش را ثابت کنیم.

مانند متغیرهای عضو استاتیک، روش های استاتیکبه هیچ یک از شیء کلاس متصل نیست. در اینجا مثال بالا است، اما با روش ایستا:

class Anything ( private: static int s_value; public: static int getValue() ( return s_value; ) // static method ); int Anything::s_value = 3; // تعریف متغیر عضو ثابت int main() ( std::cout<< Anything::getValue() << "\n"; }

از آنجایی که متدهای استاتیک به یک شی خاص محدود نمی شوند، می توان آنها را مستقیماً از طریق نام کلاس و عملگر وضوح دامنه یا از طریق اشیاء کلاس فراخوانی کرد (اما این توصیه نمی شود).

متدهای استاتیک دارای *این نشانگر نیستند

روش های استاتیک دو ویژگی جالب دارند. اولاً، چون متدهای استاتیک به یک شی محدود نمی شوند، ندارند! این منطقی است زیرا *این نشانگر همیشه به شیئی که متد روی آن کار می کند اشاره می کند. متدهای استاتیک ممکن است از طریق یک شی کار نکنند، بنابراین به *این اشاره گر نیازی نیست.

دوم، روش‌های استاتیک می‌توانند مستقیماً به سایر اعضای استاتیک (متغیرها یا توابع) دسترسی داشته باشند، اما نمی‌توانند به اعضای غیراستاتیک دسترسی داشته باشند. دلیلش این است که اعضای غیراستاتیک متعلق به شی کلاس هستند، اما متدهای استاتیک اینطور نیستند!

یک مثال دیگر

متدهای استاتیک را می توان خارج از بدنه کلاس تعریف کرد. این روش مانند روش های معمولی عمل می کند. مثلا:

#عبارتند از class IDGenerator ( private: static int s_nextID; // اعلان یک متغیر عضو استاتیک public: static int getNextID(); // اعلان یک متد استاتیک ); // تعریف متغیر عضو استاتیک خارج از بدنه کلاس است. توجه داشته باشید که در اینجا از کلمه کلیدی ثابت استفاده نمی کنیم // شروع تولید شناسه در 1 int IDGenerator::s_nextID = 1; // تعریف متد استاتیک خارج از بدنه کلاس است. توجه داشته باشید که ما از کلمه کلیدی static int IDGenerator::getNextID() (بازگرداندن s_nextID++; ) در اینجا استفاده نمی کنیم. int main() (برای (int count=0; count< 4; ++count) std::cout << "The next ID is: " << IDGenerator::getNextID() << "\n"; return 0; }

#عبارتند از

classIDGenerator

خصوصی :

static int s_nextID ; // اعلان یک متغیر عضو ثابت

عمومی :

static int getNextID(); // اعلان روش استاتیک

// شروع به تولید شناسه از 1

int IDGenerator :: s_nextID = 1 ;

int IDGenerator :: getNextID () ( برگرداندن s_nextID ++ ; )

int main()

برای (int count = 0 ; count< 4 ; ++ count )

std::cout<< "The next ID is: " << IDGenerator :: getNextID () << "\n" ;

بازگشت 0 ;

نتیجه اجرای برنامه بالا این است:

شناسه بعدی: 1
شناسه بعدی: 2
شناسه بعدی: 3
شناسه بعدی: 4

توجه داشته باشید که از آنجایی که همه متغیرها و توابع این کلاس ثابت هستند، برای کار با آن نیازی به ایجاد یک شی از این کلاس نداریم! یک متغیر عضو ایستا برای ذخیره مقدار شناسه بعدی که باید به آن اختصاص داده شود و از یک روش استاتیک برای برگرداندن شناسه و افزایش آن استفاده می شود.

اخطار در مورد کلاس هایی با همه اعضای ثابت

هنگام نوشتن کلاس با تمام اعضای ثابت مراقب باشید. در حالی که چنین "کلاس های کاملا ایستا" می توانند مفید باشند، آنها همچنین دارای اشکالاتی هستند.

اولاً، از آنجایی که همه اعضای استاتیک فقط یک بار ایجاد می‌شوند، نمی‌توان چندین نسخه از یک «کلاس کاملاً ثابت» (بدون شبیه‌سازی کلاس و تغییر نام آن بعداً) وجود داشت. به عنوان مثال، اگر به دو شی مستقل از کلاس IDGenerator نیاز داشته باشیم، این کار از طریق یک کلاس "صرفا استاتیک" امکان پذیر نخواهد بود.

C++ از سازنده های ایستا پشتیبانی نمی کند

اگر بتوانید یک متغیر عضو معمولی را از طریق مقداردهی اولیه کنید، منطقاً باید بتوانید متغیرهای عضو استاتیک را از طریق یک سازنده استاتیک مقداردهی اولیه کنید. و در حالی که برخی از زبان های مدرن دقیقاً برای این منظور از سازنده های ثابت پشتیبانی می کنند، متأسفانه C++ یکی از آنها نیست.

اگر متغیر استاتیک شما می تواند مستقیماً مقداردهی اولیه شود، پس هیچ سازنده ای لازم نیست: می توانید یک متغیر عضو استاتیک را تعریف کنید، حتی اگر خصوصی باشد. ما این کار را در مثال بالا با s_nextID انجام می دهیم. در اینجا یک مثال دیگر وجود دارد:

class Something ( public: static std::vector s_mychars; ) std:: vector چیزی::s_mychars = ( "o"، "a"، "u"، "i"، "e"); // یک متغیر عضو ثابت را تعریف کنید

کلاس چیزی

عمومی :

static std :: بردار< char >s_mychars ;

std:: vector< char >چیزی :: s_mychars = ( "o" , "a" , "u" , "i" , "e" ) ; // یک متغیر عضو ثابت را تعریف کنید

اگر مقداردهی اولیه متغیر عضو استاتیک شما نیاز به اجرای کد (مانند یک حلقه) دارد، چندین روش مختلف برای انجام آن وجود دارد. راه زیر بهترین راه است:

#عبارتند از #عبارتند از class Something ( private: static std::vector s_mychars; public: class _nested // تعریف یک کلاس تودرتو به نام _nested ( public: _nested() // سازنده _nested متغیر عضو استاتیک ما را مقداردهی اولیه می کند ( s_mychars.push_back("o"); s_mychars.push_back("a"); s_mychars.push_back ( "u")؛ s_mychars.push_back("i")؛ s_mychars.push_back("e"); ) ); // متد ایستا برای خروجی s_mychars static void getSomething() ( for (auto const &element: s_mychars) std::cout<< element << " "; } private: static _nested s_initializer; // используем статический объект класса _nested для гарантии того, что конструктор _nested выполнится }; std::vectorچیزی::s_mychars; // متغیر عضو ثابت ما را تعریف کنیم Something::_nested Something::s_initializer; // s_initializer استاتیک ما را تعریف کنید که سازنده _nested را برای مقداردهی اولیه s_mychars int main() فراخوانی می کند ( Something::getSomething(؛ return 0; )

#عبارتند از

#عبارتند از

کلاس چیزی

خصوصی :

static std :: بردار< char >s_mychars ;

عمومی :

class_neted // یک کلاس تودرتو به نام _nested تعریف کنید

عمومی :

تو در تو() // سازنده _nested متغیر عضو استاتیک ما را مقداردهی اولیه می کند

s_mychars . push_back("o");

s_mychars . push_back("a");

s_mychars . push_back("u");

s_mychars . push_back("i");

s_mychars . push_back("e");

اکثر کلمات کلیدی ++C به شما اجازه می دهند یک کار را انجام دهید. شما از int برای اعلان یک متغیر صحیح استفاده می کنید، یا زمانی که یک تابع یک مقدار صحیح را برمی گرداند، یا یک عدد صحیح را به عنوان آرگومان می گیرد. شما از عملگر جدید برای تخصیص حافظه و از عملگر حذف برای آزاد کردن آن استفاده می کنید. می توانید از const برای نشان دادن اینکه مقدار یک متغیر قابل تغییر نیست استفاده کنید. از قضا، کلمه کلیدی ایستا، اگرچه به معنای «تغییر ناپذیر» است، چندین کاربرد (و ظاهراً نامرتبط) دارد. کلمه کلیدی ثابت را می توان در سه زمینه اصلی استفاده کرد:

  • داخل یک تابع؛
  • داخل تعریف کلاس؛
  • در مقابل یک متغیر سراسری در یک فایل که یک برنامه چند فایلی را تشکیل می دهد.

استفاده از استاتیک در داخل یک تابع ساده ترین است. به این معناست که پس از مقداردهی اولیه متغیر، تا پایان برنامه در حافظه باقی می ماند. شما می توانید آن را به عنوان یک متغیر در نظر بگیرید که ارزش خود را تا پایان برنامه حفظ می کند. برای مثال، می‌توانید از یک متغیر استاتیک برای ثبت تعداد دفعاتی که یک تابع فراخوانی شده است، با اضافه کردن خطوط static int count = 0 استفاده کنید. و شمارش ++; به یک تابع از آنجایی که count یک متغیر ثابت است، خط static int count = 0; فقط یکبار اجرا خواهد شد هر زمان که تابع فراخوانی شود، count آخرین مقدار داده شده به آن را خواهد داشت.

همچنین می‌توانید از static در این روش استفاده کنید تا از مقداردهی مجدد متغیر در داخل حلقه جلوگیری کنید. به عنوان مثال، در کد زیر، متغیر number_of_times برابر با 100 خواهد بود، حتی اگر خط static int number_of_times = 0; داخل حلقه است، جایی که قرار است هر بار که برنامه به حلقه می رسد اجرا شود. ترفند این است که کلمه کلیدی ثابت از شروع مجدد متغیر جلوگیری می کند. یکی از چیزهایی که در مورد استفاده از کلمه کلیدی ثابت وجود دارد این است که به طور خودکار متغیر را برای شما صفر می کند - اما به آن تکیه نکنید (این باعث می شود که نیت شما مشخص نباشد).

برای(int ix=0; ix< 10; ix++) { for(int iy = 0; iy < 10; iy++) { static int number_of_times = 0; number_of_times++; } }

می توانید از متغیرهای استاتیک برای ذخیره اطلاعات مربوط به آخرین مقدار یک تابع برگشتی استفاده کنید، برای مثال اگر می خواهید حداکثر مقدار محاسبه شده توسط یک تابع را ذخیره کنید. اگر رشته ای را تجزیه می کنید، می توانید آخرین کاراکتر برگردانده شده توسط تابع را نیز ذخیره کنید تا بتوانید آن را با یک آرگومان فراخوانی کنید که نشان می دهد باید آخرین کاراکتر را برگرداند.

دومین استفاده از static در تعریف کلاس است. اگرچه بیشتر متغیرهای اعلام شده در یک کلاس ممکن است در هر نمونه از کلاس مقدار متفاوتی داشته باشند، فیلدهای ثابت یک کلاس برای همه نمونه های آن کلاس مقدار یکسانی خواهند داشت و حتی نیازی به ایجاد نمونه ای از آن کلاس نیست. . مفید است که متغیرهای کلاس ایستا را به عنوان نگهداری اطلاعات مورد نیاز برای ایجاد اشیاء جدید (مثلاً در کارخانه کلاس) در نظر بگیرید. به عنوان مثال، اگر می خواهید نمونه های یک کلاس را شماره گذاری کنید، می توانید از یک متغیر ثابت برای پیگیری آخرین عدد استفاده شده استفاده کنید. توجه به این نکته مهم است که هنگام استفاده از متغیرهای کلاس استاتیک استفاده از class_name::x; ، نه instance_of_class.x; . این به برنامه نویس کمک می کند تا به برنامه نویس یادآوری کند که متغیرهای استاتیک به یک نمونه کلاس تعلق ندارند و شما مجبور نیستید نمونه ای از آن کلاس ایجاد کنید. همانطور که احتمالاً تا به حال متوجه شده اید، می توانید از عملگر scope، :: برای دسترسی به static هنگام دسترسی به آن از طریق نام کلاس استفاده کنید.

هنگام اشکال زدایی یا اجرای برنامه با استفاده از static، مهم است که به خاطر داشته باشید که نمی توانید آن را در یک کلاس مقداردهی اولیه کنید. در واقع، اگر تصمیم دارید تمام کدهای کلاس را در یک فایل هدر بنویسید، حتی نمی توانید یک متغیر استاتیک را در داخل فایل هدر مقداردهی اولیه کنید. آن را در فایل cpp. انجام دهید. همچنین، شما باید اعضای ثابت کلاس را مقداردهی اولیه کنید، در غیر این صورت آنها در محدوده قرار نخواهند داشت. (سینتکس کمی عجیب است: class_name::static_variable = مقدار را تایپ کنید.)

شما همچنین می توانید توابع کلاس استاتیک داشته باشید. توابع ایستا توابعی هستند که به نمونه ای از کلاس نیاز ندارند و به همان روش، بر اساس قیاس با متغیرهای استاتیک، با نام کلاس و نه با نام شی فراخوانی می شوند. به عنوان مثال، a_class::static_function(); ، نه an_instance.function(); . توابع استاتیک فقط می توانند روی اعضای ثابت یک کلاس کار کنند، زیرا به نمونه های خاصی از کلاس اشاره نمی کنند. توابع استاتیک را می توان برای تغییر متغیرهای استاتیک، ردیابی مقادیر آنها استفاده کرد - برای مثال، اگر انتخاب می کنید از یک شمارنده استفاده کنید تا به هر نمونه کلاس یک شناسه منحصر به فرد بدهید، می توانید از یک تابع استاتیک استفاده کنید.

برای مثال می توانید از کد زیر استفاده کنید:

کاربر کلاس ( private: int id; static int next_id; public: static int next_user_id() ( next_id++; return next_id; ) // روش های دیگر برای user class user() // class constructor ( id = user::next_id++; / / یا فراخوانی متد، id = user.next_user_id(); ) ); int user::next_id = 0;

توجه داشته باشید که در هنگام تنظیم باید نوع متغیر استاتیک را درج کنید!

کاربر a_user;

شناسه را به شماره ID بعدی که توسط هیچ شیء کاربر دیگری استفاده نمی شود تنظیم می کند. توجه داشته باشید که سبک خوبی است که یک شناسه را به عنوان یک ثابت اعلام کنید.

آخرین استفاده از static یک متغیر سراسری در یک فایل کد است. در این حالت استفاده از static نشان می دهد که کد منبع در فایل های دیگر که بخشی از پروژه هستند نمی توانند به متغیر دسترسی داشته باشند. فقط کد داخل همان فایل می تواند متغیر را ببیند (حوزه آن محدود به فایل است). این تکنیک می‌تواند برای مدل‌سازی کد شی‌گرا استفاده شود، زیرا دید متغیرها را محدود می‌کند و در نتیجه به جلوگیری از برخورد نام کمک می‌کند. این روش استفاده از استاتیک یک نگهدارنده از C است.